一、训练模型
构建模型(假设为model)后,接下来就是训练模型。PyTorch训练模型主要包括加载数据集、损失计算、定义优化算法、反向传播、参数更新等主要步骤。
1.加载预处理数据集
加载和预处理数据集,可以使用PyTorch的数据处理工具,如torch.utils和torchvision等,这些工具将在第4章详细介绍。
2.定义损失函数
定义损失函数可以通过自定义方法或使用PyTorch内置的损失函数,如回归使用的losss_fun=nn.MSELoss(),分类使用的mn.BCELoss等损失函数,更多内容可参考本书5.2.4节。
3.定义优化方法
Pytoch常用的优化方法都封装在torch.optim里面,其设计很灵活,可以扩展为自定义的优化方法。所有的优化方法都是继承了基类optim.Optimizer,并实现了自己的优化步骤。
最常用的优化算法就是梯度下降法及其各种变种,具体将在5.4节详细介绍,这些优化算法大多使用梯度更新参数。
如使用SGD优化器时,可设置为optimizer = torch.optim.SGD(params,lr =0.001)。
4.循环训练模型
1) 设置为训练模式: model.train()
调用model.train()会把所有的module设置为训练模式。
2)梯度清零:
optimizer. zero_grad()
在默认情况下梯度是累加的,需要手工把梯度初始化或清零,调用optimizer.zero_grad() 即可。
3)求损失值: y_prev=model(x)
loss=loss_fun(y_prev,y_true)
4)自动求导,实现梯度的反向传播: loss.backward()
5)更新参数: optimizer.step()
5.循环测试或验证模型
1) 设置为测试或验证模式: model.eval()
调用model.eval()会把所有的training属性设置为False。
2)在不跟踪梯度模式下计算损失值、预测值等: with. torch.no grad():
6.可视化结果
下面我们通过实例来说明如何使用rn来构建网络模型、训练模型。
[说明]model.train()与model.eval()的使用
如果模型中有BN(Batch Normalization)层和Dropout,需要在训练时添加model.train(),在测试时添加model.eval()。其中model.train()是保证BN层用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差;而对于 Dropout, model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接。
二、实现神经网络实例
前面我们介绍了使用PyTorch构建神经网络的一些组件、常用方法和主要步骤等,本节通过一个构建神经网络的实例把这些内容有机结合起来。
(一)背景说明
本节将利用神经网络完成对手写数字进行识别的实例,来说明如何借助nn工具箱来实现一个神经网络,并对神经网络有个直观了解。在这个基础上,后续我们将对nn的各模块进行详细介绍。实例环境使用PyTorch1.5+,GPU或CPU,源数据集为MNIST。主要步骤如下。
- 利用PyTorch内置函数mnist下载数据。
- 利用torchvision对数据进行预处理,调用torch.utils建立一个数据迭代器。可视化源数据。
- 利用nn工具箱构建神经网络模型。
- 实例化模型,并定义损失函数及优化器。·训练模型。可视化结果。
使用两个隐含层,每层使用ReLU激活函数,输出层使用softmax激活函数,最后使用torch.max(out,1)找出张量out最大值对应索引作为预测值。
(二)准备数据
1、使用PyTorch框架进行MNIST数据集准备的Python代码
这段代码的目的是准备MNIST数据集,以便后续用于训练和测试神经网络模型。
2这段代码及说明是对之前MNIST数据集加载和处理过程中一些关键函数和操作的进一步解释,并且通过代码示例展示了如何从数据加载器中获取数据以及查看数据的形状。
(三)可视化源数据
可视化MNIST测试数据集中的部分手写数字图像
代码运行后,会生成一个包含6个MNIST手写数字图像的图形,每个图像上方都有其对应的真实标签(Ground Truth),如图中展示的数字7、2、1、0、4、1 。通过这种方式,可以直观地查看MNIST数据集中的样本,帮助理解数据的特征和分布情况。
(四)构建模型
使用PyTorch构建一个用于MNIST手写数字分类的神经网络模型,并进行相关的配置
这段代码构建了一个简单的多层感知机(MLP)模型用于MNIST手写数字分类任务,并进行了模型实例化、设备配置以及损失函数和优化器的定义,为后续的训练过程做好了准备。
(五)训练模型
这段代码实现了对神经网络模型的训练过程,包括多个训练周期、每个周期内对批次数据的处理、损失计算、反向传播和参数更新,同时记录了训练损失和准确率等指标,以便后续分析和可视化。
通过这种可视化方式,可以直观地了解模型训练的效果和进展情况,帮助分析模型是否收敛以及训练过程是否正常。