深入浅出PyTorch - Pytorch进阶训练技巧

PyTorch进阶训练技巧


深入浅出PyTorch

  • PyTorch进阶训练技巧
  • 动态调整学习率
    • 模型微调


提示:以下是本篇文章正文内容,下面案例可供参考

学习率的选择是深度学习中一个困扰人们许久的问题,学习速率设置过小,会极大降低收敛速度,增加训练时间;学习率太大,可能导致参数在最优解两侧来回振荡。但是当我们选定了一个合适的学习率后,经过许多轮的训练后,可能会出现准确率震荡或loss不再下降等情况,说明当前学习率已不能满足模型调优的需求。此时我们就可以通过一个适当的学习率衰减策略来改善这种现象,提高我们的精度。这种设置方式在PyTorch中被称为scheduler。

动态调整学习率

PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现。
深入浅出PyTorch - Pytorch进阶训练技巧_第1张图片

PyTorch提供的学习率调整策略分为三大类,分别是:
1)有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和余弦退火CosineAnnealing。
2)自适应调整:自适应调整学习率 ReduceLROnPlateau。
3)自定义调整:自定义调整学习率 LambdaLR。

下面,以StepLR - 有序调整学习率方法为例,说明动态学习率调整的使用方法和效果对比。

功能: 等间隔调整学习率,调整倍数为gamma倍,调整间隔为step_size。间隔单位是step。需要注意的是,此处step是指epoch。
实现代码如下,…为省略的部分其他代码,动态调整学习率需要在参数优化结束后完成。

optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler1 = torch.optim.lr_scheduler.StepLR(optimizer, step_size=6, gamma=0.5)
for epoch in range(1, 200):
    ...
    optimizer.zero_grad()
    ...
    optimizer.step()
	scheduler1.step()

val_loss1是未使用动态学习率调整的验证损失,val_loss是使用StepLR动态学习率调整的验证损失。可以明显看出,该方法可以是模型损失快速收敛。
深入浅出PyTorch - Pytorch进阶训练技巧_第2张图片

模型微调

随着深度学习的发展,模型的参数越来越大,许多开源模型都是在较大数据集上进行训练的,但在实际应用中,数据集并没有真么大,如果将开源大数据模型在真实小数据集上重新训练,那么必定将导致模型过拟合,且该过拟合模型的精度也会因数据量的影响而过低,致使模型无法使用。
最为简单粗暴的解决方法就是增大数据集,但显然这会增大包含人力、经济等因素在内的成本。而迁移学习正是该问题的另一种解决方案,思路就是从源数据集学到的知识迁移到目标数据集上。迁移学习最大的应用场景就是模型微调,在面对实际场景时,先找到同类问题的已训练可用模型,训练自己的数据得到参数休正后的模型。
PyTorch中有大量已训练好的模型,通过微调可以辅助快速解决问题。模型微调的流程如下:

  1. 在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型。
  2. 创建一个新的神经网络模型,即目标模型。该目标模型复制了源模型上除输出层以外的所有模型结构及其参数。假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集。还假设源模型的输出层跟源数据集的标签紧密相关,因此在目标模型中不予采用。
  3. 为目标模型添加一个输出⼤小为⽬标数据集类别个数的输出层,并随机初始化该层的模型参数。
  4. 在目标数据集上训练目标模型。我们将从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的。

你可能感兴趣的:(PyTorch,pytorch)