苏州公司网站建设方案,设计公司企业介绍,软件二次开发,辽宁建设工程信息网诚信备案库目录 1. 模型训练的基本步骤1.1 train、test数据下载1.2 train、test数据加载1.3 Lenet5实例化、初始化loss函数、初始化优化器1.4 开始train和test 2. 完整代码 1. 模型训练的基本步骤
以cifar10和Lenet5为例
1.1 train、test数据下载
使用torchvision中的datasets可以方便… 目录 1. 模型训练的基本步骤1.1 train、test数据下载1.2 train、test数据加载1.3 Lenet5实例化、初始化loss函数、初始化优化器1.4 开始train和test 2. 完整代码 1. 模型训练的基本步骤
以cifar10和Lenet5为例
1.1 train、test数据下载
使用torchvision中的datasets可以方便下载cifar10数据
cifar_train datasets.CIFAR10(cifa, True, transformtransforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225])]), downloadTrue)transforms.Resize((32, 32)) 将数据图形数据resize为32x32这里可不用因为cifar10本身就是32x32 transforms.ToTensor()是将numpy或者numpy数组或PIL图像转换为PyTorch的Tensor格式以便输入网络。 transforms.Normalize()根据指定的均值和标准差对每个颜色通道进行图像归一化可以提高神经网络训练过程中的收敛速度
1.2 train、test数据加载
使用pytorch torch.utils.data中的DataLoader用来加载数据
cifar_train DataLoader(cifar_train, batch_sizebatchz, shuffleTrue)batch_sizebatchz: 这里batchz是一个变量代表每个批次的样本数量。 shuffleTrue: 这个参数设定为True意味着在每次训练循环epoch开始前数据集中的样本会被随机打乱顺序。这样做可以增加训练过程中的随机性帮助模型更好地泛化避免过拟合特定的样本排列顺序。
1.3 Lenet5实例化、初始化loss函数、初始化优化器 device torch.device(cuda)model Lenet5().to(device)crition nn.CrossEntropyLoss().to(device)optimizer optim.Adam(model.parameters(), lr1e-3)注意网络和模型一定要搬到GPU上
1.4 开始train和test
循环epoch加载train数据、输入模型、计算loss、backward、调用优化器加载test数据、输入模型、计算prediction、计算正确率输出正确率 for epoch in range(1000):model.train()for batch, (x, label) in enumerate(cifar_train):x, label x.to(device), label.to(device)logits model(x)loss crition(logits, label)optimizer.zero_grad()loss.backward()optimizer.step()# testmodel.eval()with torch.no_grad():total_correct 0total_num 0for x, label in cifar_test:x, label x.to(device), label.to(device)logits model(x)pred logits.argmax(dim1)correct torch.eq(pred, label).float().sum().item()total_correct correcttotal_num x.size(0)acc total_correct / total_numprint(epoch, test acc:, acc)2. 完整代码
import torch
from torchvision import datasets
from torch.utils.data import DataLoader
from torchvision import transforms
from torch import nn, optim
import syssys.path.append(.)
from Lenet5 import Lenet5def main():batchz 128cifar_train datasets.CIFAR10(cifa, True, transformtransforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225])]), downloadTrue)cifar_train DataLoader(cifar_train, batch_sizebatchz, shuffleTrue)cifar_test datasets.CIFAR10(cifa, False, transformtransforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize(mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225])]), downloadTrue)cifar_test DataLoader(cifar_test, batch_sizebatchz, shuffleTrue)device torch.device(cuda)model Lenet5().to(device)crition nn.CrossEntropyLoss().to(device)optimizer optim.Adam(model.parameters(), lr1e-3)for epoch in range(1000):model.train()for batch, (x, label) in enumerate(cifar_train):x, label x.to(device), label.to(device)logits model(x)loss crition(logits, label)optimizer.zero_grad()loss.backward()optimizer.step()# testmodel.eval()with torch.no_grad():total_correct 0total_num 0for x, label in cifar_test:x, label x.to(device), label.to(device)logits model(x)pred logits.argmax(dim1)correct torch.eq(pred, label).float().sum().item()total_correct correcttotal_num x.size(0)acc total_correct / total_numprint(epoch, test acc:, acc)if __name__ __main__:main()
model.train()和model.eval()的区别和作用 model.train() 作用当调用模型的model.train()方法时模型会进入训练模式。这意味着 启用 Dropout层和BatchNorm层在训练模式下Dropout层会按照设定的概率随机“丢弃”一部分神经元以防止过拟合而Batch Normalization批规范化层会根据当前批次的数据动态计算均值和方差进行归一化。 梯度计算允许梯度计算这是反向传播和权重更新的基础。 应用场景在模型的训练循环中每次迭代开始之前调用以确保模型处于正确的训练状态。
model.eval() 作用调用model.eval()方法后模型会进入评估模式。此时 禁用 Dropout层Dropout层在评估时不发挥作用所有的神经元都会被保留以确保预测的确定性和可重复性。 固定 BatchNorm层BatchNorm层使用训练过程中积累的统计量全局均值和方差进行归一化而不是当前批次的统计量这有助于模型输出更加稳定和一致。 应用场景在验证或测试模型性能时使用确保模型输出是确定性的不受训练时特有的随机操作影响以便于准确评估模型的泛化能力。