FASTAI笔记-3-学习率选取-随着课程深入会随时更新

学习率的选取对于训练过程中的loss减小和metrics提高有很重要的意义,如何选择学习率也很重要。

在fastai中,进行训练时通常有两个阶段,也就是代码中经常会见到的:

'''
    stage_1:为迁移学习后的模型参数。
    stage_2:为微调后的模型参数
'''
learn.save('stage_1')
learn.save('stage_2')

对于每个stage,使用的学习率都是不一样的,让我们将重点放在整个训练过程。

'''
    完全的训练过程
    1.迁移学习
'''
# 搭建网络,输入数据,指定metrics函数
learn = create_cnn(data, models.resnet34, metrics=accuracy)
# 开始寻找学习率(第一阶段学习率)
learn.lr_find()
learn.recorder.plot()
# 使用该方法会得到一个梯度最小值对应的学习率,就是用该学习率为第一阶段学习率,实例中设为LR
lr = LR
# 另外,默认学习率为1e-3,也可以使用默认学习率,也就是说,不传入slice(lr)这个参数
# 开始训练
learn.fit_one_cycle(5, slice(lr))
# 接下来看一下训练中的loss和lr变化
learn.recorder.plot_losses()
learn.recorder.plot_lr()
# 保存第一阶段数据
learn.save('stage_1')

聚焦学习率的选择,在使用recorder.plot()之后,会得到一个梯度最小时对应的学习率,可以选择那个学习率,当然如果表现不好,可以重新选择,选择的标准为loss下降幅度很快的(负斜率很高的点)所对应的学习率。

让我们继续训练。

'''
    第二阶段训练:fine tuning
'''
# 解冻除最后一层分类层的模型参数
learn.unfreeze()
# 打印学习率与loss关系
learn.lr_find()
learn.recorder.plot()
# 开始选择学习率
'''
    结合课程一般来说此时学习率为两个部分
    slice(left, right)
    left:图中曲线开始爆发上升时所对应的lr,将它缩小10倍
    右边部分为第一阶段选择的学习率,然后将它除以5或者是10,这个为经验值
'''
lr = slice(1e-5, LR/5)
learn.fit_one_cycle(5, lr)
# 保存微调之后的模型参数
learn.save('stage_2')

第二阶段的学习率一般分为两部分:

slice(a,b)

a的取值:学习率与loss曲线中曲线上升对应学习率的-10倍,若还略微上升再来-10倍

b的取值:使用第一阶段的学习率,再除以5或者10,此为经验值。

另外在训练完毕后使用:

learn.recorder.plot_losses()
learn.recorder.plot_lr()

如果看到loss先增然后到了max_lr后,开始递减,那么你就是找到了一个比较好的lr。

如果你仔细观察上面两行命令打印的图像,会发现

learn.fit_one_cycle(4, slice(lr))

中传递的其实是最大的lr。

你可能感兴趣的:(AI,python3,深度学习)