首页 > 其他分享 >第三章 3.6 批大小的影响

第三章 3.6 批大小的影响

时间:2024-12-16 10:31:00浏览次数:3  
标签:loss plt 第三章 val batch 3.6 train 大小 model

第三章 3.4 训练神经网络

 

# https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch
# https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch

###################  Chapter Three #######################################

# 第三章  读取数据集并显示
from torch.utils.data import Dataset, DataLoader
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
########################################################################
from torchvision import datasets
import torch
data_folder = '~/data/FMNIST' # This can be any directory you want to
# download FMNIST to
fmnist = datasets.FashionMNIST(data_folder, download=True, train=True)
tr_images = fmnist.data
tr_targets = fmnist.targets

val_fmnist = datasets.FashionMNIST(data_folder, download=True, train=False)
val_images = val_fmnist.data
val_targets = val_fmnist.targets


########################################################################
import matplotlib.pyplot as plt
#matplotlib inline
import numpy as np
from torch.utils.data import Dataset, DataLoader
import torch
import torch.nn as nn
device = 'cuda' if torch.cuda.is_available() else 'cpu'

########################################################################
class FMNISTDataset(Dataset):
    def __init__(self, x, y):
        x = x.float()/255 #归一化
        x = x.view(-1,28*28)
        self.x, self.y = x, y
    def __getitem__(self, ix):
        x, y = self.x[ix], self.y[ix]
        return x.to(device), y.to(device)
    def __len__(self):
        return len(self.x)

from torch.optim import SGD, Adam
def get_model():
    model = nn.Sequential(
        nn.Linear(28 * 28, 1000),
        nn.ReLU(),
        nn.Linear(1000, 10)
    ).to(device)

    loss_fn = nn.CrossEntropyLoss()
    optimizer = Adam(model.parameters(), lr=1e-2)
    return model, loss_fn, optimizer

def train_batch(x, y, model, optimizer, loss_fn):
    model.train()
    prediction = model(x)
    batch_loss = loss_fn(prediction, y)
    batch_loss.backward()
    optimizer.step()
    optimizer.zero_grad()
    return batch_loss.item()

def accuracy(x, y, model):
    model.eval()
    # this is the same as @torch.no_grad
    # at the top of function, only difference
    # being, grad is not computed in the with scope
    with torch.no_grad():
        prediction = model(x)
    max_values, argmaxes = prediction.max(-1)
    is_correct = argmaxes == y
    return is_correct.cpu().numpy().tolist()

########################################################################
def get_data():
    train = FMNISTDataset(tr_images, tr_targets)
    trn_dl = DataLoader(train, batch_size=10000, shuffle=True) # 比较批大小分别是10000,和32是,损失函数值 和 准确度值,注意:数据集只有60000个样本
    val = FMNISTDataset(val_images, val_targets)
    val_dl = DataLoader(val, batch_size=len(val_images), shuffle=False)
    return trn_dl, val_dl
########################################################################
#@torch.no_grad()
def val_loss(x, y, model):
    with torch.no_grad():
        prediction = model(x)
    val_loss = loss_fn(prediction, y)
    return val_loss.item()

########################################################################
trn_dl, val_dl = get_data()
model, loss_fn, optimizer = get_model()

########################################################################
train_losses, train_accuracies = [], []
val_losses, val_accuracies = [], []
for epoch in range(5):
    print(epoch)
    train_epoch_losses, train_epoch_accuracies = [], []
    for ix, batch in enumerate(iter(trn_dl)):
        x, y = batch
        batch_loss = train_batch(x, y, model, optimizer, loss_fn)
        train_epoch_losses.append(batch_loss)
    train_epoch_loss = np.array(train_epoch_losses).mean()

    for ix, batch in enumerate(iter(trn_dl)):
        x, y = batch
        is_correct = accuracy(x, y, model)
        train_epoch_accuracies.extend(is_correct)
    train_epoch_accuracy = np.mean(train_epoch_accuracies)
    for ix, batch in enumerate(iter(val_dl)):
        x, y = batch
        val_is_correct = accuracy(x, y, model)
        validation_loss = val_loss(x, y, model)
    val_epoch_accuracy = np.mean(val_is_correct)
    train_losses.append(train_epoch_loss)
    train_accuracies.append(train_epoch_accuracy)
    val_losses.append(validation_loss)
    val_accuracies.append(val_epoch_accuracy)

########################################################################
epochs = np.arange(5)+1
import matplotlib.ticker as mtick
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
#%matplotlib inline
plt.figure(figsize=(20,5))
plt.subplot(211)
plt.plot(epochs, train_losses, 'bo', label='Training loss')
plt.plot(epochs, val_losses, 'r', label='Validation loss')
plt.gca().xaxis.set_major_locator(mticker.MultipleLocator(1))
plt.title('Training and validation loss when batch size is 32')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.grid('off')
#plt.show()
plt.subplot(212)
plt.plot(epochs, train_accuracies, 'bo', label='Training accuracy')
plt.plot(epochs, val_accuracies, 'r', label='Validation accuracy')
plt.gca().xaxis.set_major_locator(mticker.MultipleLocator(1))
plt.title('Training and validation accuracy when batch size is 32')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()])
plt.legend()
plt.grid('off')
plt.show()

 

标签:loss,plt,第三章,val,batch,3.6,train,大小,model
From: https://www.cnblogs.com/excellentHellen/p/18604859

相关文章

  • Java核心技术卷1 第三章选读
    前言本文内容选自Java核心技术卷1第10版,感兴趣的小伙伴可以自行阅读原书,以下内容为本人学习后摘取的片段与大家分享。正文3.3.2浮点类型所有的浮点数值计算都遵循IEEE754规范。具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:正无穷大负无穷大NaN(不......
  • 如何让img自动适应div容器大小?
    在前端开发中,要使图像(<img>)自动适应其包含的<div>容器的大小,你可以使用CSS的一些属性。下面是一些常见的方法:1.使用max-width和height:auto你可以将图像的max-width设置为100%,这样它就不会超过其容器的宽度。同时,将height设置为auto可以保持图像的原始纵横比。......
  • 如何阻止屏幕旋转时自动调整字体的大小?
    在前端开发中,阻止屏幕旋转时自动调整字体的大小可以通过CSS样式设置来实现。以下是一些具体的步骤和方法:使用CSS的text-size-adjust属性:这个属性允许Web开发者控制移动浏览器如何在改变屏幕方向(例如,从竖屏转到横屏)时自动调整文本的大小。可以通过为元素设置-webkit-text-siz......
  • 在PbootCMS中如何处理不同Web服务器的文件上传大小限制?
    在PbootCMS中,处理不同Web服务器的文件上传大小限制需要针对每种Web服务器进行特定的配置。以下是针对IIS、Nginx和Apache三种常见Web服务器的详细配置方法:IIS:打开IIS管理器:打开IIS管理器,选择要修改的网站。请求筛选:在右侧操作栏中,点击“请求筛选”。编辑功能设置:在“请求筛......
  • 第三章 3.4 训练神经网络
     代码:#https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch#https://github.com/PacktPublishing/Modern-Computer-Vision-with-PyTorch###################ChapterThree########################################第三章读取数据集并显示......
  • 分区表(Partition Table)是存储在磁盘上的一块数据区域,用于记录磁盘上各个分区的位置和
    分区表是什么?分区表(PartitionTable)是存储在磁盘上的一块数据区域,用于记录磁盘上各个分区的位置和大小信息。它是操作系统管理硬盘的基础,是硬盘和操作系统之间的“桥梁”。分区表包含有关磁盘上每个分区的关键信息,如起始位置、结束位置、分区大小、分区类型等。分区表的作用是什......
  • Problem: 1338. 数组大小减半 贪心 模拟 法 简单易懂
    Problem:1338.数组大小减半思路因为要选择最小的整数集合,这里用Counter容器来统计下所有各种数字的大小,然后按照值来排序,设置target来表示要到达什么位置,这里最好不要用整除,防止要计算的大于arr,但是len(arr)是奇数,这里total表示删除到这个位置已经删除了多少数字,如果大......
  • 分区对齐(Partition Alignment)是指磁盘分区表中的分区起始位置与硬盘的物理扇区(或磁盘
    分区对齐(PartitionAlignment)是指磁盘分区表中的分区起始位置与硬盘的物理扇区(或磁盘块)进行对齐的技术。具体来说,分区的起始位置会与磁盘的物理块大小对齐,通常是以512字节、4KB等为单位的。为什么分区需要对齐?提高性能:现代硬盘(尤其是固态硬盘,SSD)通常具有更大的扇区大小(例如4KB......
  • php网站如何修改图片大小,轻松调整网站图片尺寸
    修改网站上的图片大小是一个常见的任务,可以通过多种方法实现,包括使用图像编辑软件、CSS调整和服务器端处理。以下是详细的步骤:使用图像编辑软件:打开原始图片,使用图像编辑软件(如Photoshop、GIMP)调整图片大小。保存调整后的图片,并替换网站上的旧图片。使用CSS调整:在CSS文......
  • 网站框架大小怎样修改,如何调整网站框架的大小
    如何调整网站框架的大小登录后台管理:使用管理员账号登录网站的后台管理界面。通常在网站的底部或顶部导航栏可以找到登录入口。导航至模板管理:在后台管理界面的左侧菜单栏中,找到“模板管理”或“主题管理”选项。选择CSS文件:进入模板管理页面,找到需要修改的CSS文件。常见的CSS......