深度学习案例教程 教案4.5.3FashionMNIST识别网络训练.docx
(p1)
本节课我们来讲解实践任务3FashionMNIST识别网络训练
在开始模型训练前,我们需要设置损失函数和优化器
我们可以使用torch.nn模块自带的CrossEntropy损失,
PyTorch会自动把整数型的label转为one-hot型,
用于计算交叉熵损失。
这里需要确保label是从0开始的,
同时模型不加softmax层,
这也说明了PyTorch训练中各个部分不是独立的,需要全盘考虑。
(p2)
这行代码定义了一个交叉熵损失函数,
用于计算模型的预测值与真实标签之间的差距。
交叉熵损失函数通常用于多分类问题
,可以有效地惩罚模型对错误类别的预测,并提高模型的分类精度。
在使用交叉熵损失函数时,
我们需要将模型的输出结果与真实标签作为输入,
计算损失值并反向传播误差,以更新模型的参数。
(p3)
接着我们来设置优化器
这行代码定义了一个Adam优化器,用于更新模型的参数。
在深度学习模型中,优化器是用于最小化损失函数的一种算法,
其目标是通过调整模型的参数,使损失函数最小化,
从而提高模型的准确性和泛化能力。
Adam是一种自适应学习率优化算法,
能够根据每个参数的梯度自适应地调整其学习率,
从而提高训练效率和准确性。
在使用Adam优化器时,我们需要将模型的参数和学习率作为输入,
通过反向传播算法计算梯度并更新模型的参数。
这样,模型就能够在训练过程中自适应地调整参数,最小化损失函数,提高模型的性能。
(p4)
完成了损失函数和优化器的定义后,我们来一起看一下训练函数如何编写
这段代码定义了一个训练函数train(epoch),
用于训模型。该函数包括以下步骤:
首先使用model.train()将模型设置为训练模式,
以便在训练过程中启用dropout等操作。
接下来我们来看for循环中的代码,
对于每个batch的数据,
我们首先将其移动到GPU上进行计算,
然后使用optimizer.zero_grad()将模型的参数梯度清零,
再进行前向传播计算输出结果,
使用criterion(output,label)计算损失函数,
然后使用loss.backward()和optimizer.step()进行反向传播计算梯度并更新模型参数。
这一步是训练模型的核心步骤,
通过计算损失函数并反向传播误差,
模型能够自适应地调整参数,
最小化损失函数,提高模型的准确性和泛化能力。
train_loss记录的是所有batch的损失值之和。
(p5)
将train_loss除以训练集的总样本数,
得到每个样本的平均损失。
这一步是为了计算模型在整个训练集上的平均损失,
以便评估模型的训练效果。
最后使用print函数输出当前epoch的训练结果,
包括当前epoch的编号和平均训练损失。
这一步是为了在训练过程中实时监控模型的训练效果,以便进行调整和优化。
(p6)
我们再来简单讲解下训练卷积神经网络过程中需要注意的点:
一数据增强:在训练卷积神经网络之前,通常需要对训练数据进行数据增强。
数据增强是通过应用一系列随机变换(如随机旋转、随机翻转、随机裁剪等)来扩充训练数据集,
以增加模型的泛化能力。数据增强可以帮助模型更好地适应各种变化和噪声。
二学习率的调整:学习率是训练卷积神经网络的一个重要超参数,需要适时地调整学习率,
以避免模型陷入局部最优解或者训练过程不稳定。
常见的学习率调整策略包括学习率衰减、动态调整学习率等。
三批量归一化:批量归一化是一种有效的正则化方法,
可以加速训练过程并提高模型的准确性和泛化能力。
批量归一化通过在每一层的输入上进行归一化操作,
使得网络层之间的分布更加稳定,有助于缓解梯度消失和梯度爆炸问题。
四使用预训练模型:在训练卷积神经网络之前,可以使用预训练模型进行参数初始化。
预训练模型是在大规模数据集上训练得到的模型,具有较好的特征提取能力。
通过使用预训练模型进行参数初始化,可以加速训练过程和提高模型的准确性。
五梯度裁剪:在训练卷积神经网络时,梯度爆炸和梯度消失问题可能会影响模型的训练效果。
梯度裁剪是一种常用的解决方法,通过对梯度进行剪切,使其在一定范围内,
以避免梯度过大或过小对模型的训练造成不良影响。
(p7)
最后我们再来总结一下,训练卷积神经网络模型的技巧
第一点是正则化:在训练卷积神经网络时,
使用正则化方法可以避免模型过拟合,提高模型的泛化能力。
二是选择合适的损失函数:选择合适的损失函数对于训练卷积神经网络非常重要,
常用的损失函数包括交叉熵损失函数、均方误差损失函数和对比损失函数等。
三是提前停止:在训练卷积神经网络时,
可以使用提前停止技术来避免模型过拟合,提高模型的泛化能力。
四是参数初始化:在训练卷积神