训练过程
(1)设置优化器
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)
#Adam优化器,是一种自适应学习率的算法,常用于训练深度学习模型
#model.parameters()返回模型中所有需要被训练的参数
#lr=0.001设置了学习率0.001,学习率是一个超参数,用来控制在优化过程中参数更新的步长大小
(2)定义损失函数
criterion=nn.CrossEntropyLoss()
#使用交叉熵损失函数,他是分类任务中常用的损失函数之一。他同时考虑了正确分类的概率并进行了对数交换,以胜避数值不稳定
(3)训练循环
for epoch in range(5):
for images,labels in train_loader:
#外层循环变量epoch用于迭代器遍历训练数据。train_loader将数据集分成多个批次,其中每个批次都包含了图像和相应的标签
(4)数据预处理
images=images.view(-1,28*28)
#将图像张量从二维图像(每个图像28*28像素)转换为一维向量,因为我们的模型是全连接的(SimpleNN).-1在这里的意思是自动计算这一维的大小,确保整个批次的数据能被正确reshape
(5)梯度归零
optimizer.zero_grad()
#在每次的梯度计算之前需要将梯度归零(重置),否则梯度会累加到已有的梯度上,这是因为Pytorch在调用.backward()时默认会累积梯度
(6)前向传播
output=model(images)
#执行模型的前向传播步骤,输出每个类别的预测结果
(7)计算损失
loss=criterion(output,labels)
#根据模型输出和真实标签计算损失值
(8)反向传播
loss.backward()
#执行反向传播,计算关于损失函数的所有模型参数的梯度
(9)参数更新
optimizer.step()
#根据计算得到的梯度更新模型参数,以最小化损失函数
评估与分析
(1)函数定义
def evaluate_model(model,data_loader):
#定义名为evaluate_model的函数,接受两个参数:model---训练好的模型,data_loader---用于评估该模型的数据加载器
(2)模型评估模式
model.eval()
#调用.eval()将模型设置到评估模式
(3)初始化计数器
total_correct=0
total=0
#初始化total_correct变量来记录预测正确的样本数量,初始化total变量来记录总样本数量
(4)禁用梯度计算
with torch.no_grad():
#使用torch.no_grad()上下文管理器在评估模型时禁用梯度计算
(5)数据加载并处理
for images,labels in data_loader:
images=images.view(-1,28*28)
#迭代数据加载器中的数据,数据加载器返回一批图像和对应的标签。
#将每批图像数据通过view方法调整为二维张量,以匹配模型的输入格式(模型期望输入为向量形式)
(6)模型预测
output=model(images)
_,predicted=torch.max(output.data,1)
#使用模型对输入图像进行前向传播,得到预测结果
#torch.max(outpuut.data,1)返回每一行的最大值的索引,即预测的类别标签
(7)统计正确的预测数量和总数量
total+=labels.size(0)
total_correct+=(predicted==labels).sum().item()
#更新总样本数。labels.size(0)给出当前批次的样本数量。
#更新正确预测的总数。比较predicted和labels得到一个布尔张量,然后使用.sum().item()得到正确预测的数量
(8)打印准确率
print(f'Accuracy:{100*total_correct/total:.2f}%')
#最后输出准确率,计算方式是正确预测的数量除以总样本数量,转换为百分比格式输出
(9)调用函数评估模型
evaluate_model(model,test_loader)
#使用上面定义的evaluate_model函数和参数model(训练好的模型)及test_loader(测试数据加载器)来评估模型性能