在进行实验时,调整学习率的方法感觉不对。官方讲解:
https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate
1学习率的位置
torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。
而torch.optim.lr_scheduler.ReduceLROnPlateau则提供了基于训练中某些测量值使学习率动态下降的方法。
>>> scheduler = ...
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
一定要注意学习率的位置
2 lr_scheduler调整策略:根据训练次数
torch.optim.lr_scheduler中大部分调整学习率的方法都是根据epoch训练次数,这里介绍常见的几种方法,其他方法以后用到再补充。
要了解每个类的更新策略,可直接查看官网doc中的源码,每类都有个get_lr方法,定义了更新策略。
2.1 torch.optim.lr_scheduler.LambdaLR
语法:
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
更新策略:
new_lr=λ×initial_lr
其中 new _ lr是得到的新的学习率, initial_lr initial_lr是初始的学习率, λ 是通过参数lr_lambda和epoch得到的。
参数
- optimizer (Optimizer):要更改学习率的优化器;
- lr_lambda(function or list):根据epoch计算 λ \lambda λ的函数;或者是一个list的这样的function,分别计算各个parameter groups的学习率更新用到的 λ \lambda λ;
- last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。
2.2torch.optim.lr_scheduler.StepLR
语法:
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
更新策略:
每过step_size个epoch,更新一次
参数:
- optimizer (Optimizer):要更改学习率的优化器;
- step_size(int):每训练step_size个epoch,更新一次参数;
- gamma(float):更新lr的乘法因子;
- last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。
2.3torch.optim.lr_scheduler.MultiStepLR
语法:
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
更新策略:
每次遇到milestones中的epoch,做一次更新: