scheduler:pytorch训练过程中自动调整learning rate
在使用PyTorch训练神经网络时,可能需要根据情况调整学习率(learning rate)这个在梯度下降中的重要参数。PyTorch提供了scheduler工具包帮助实现这一功能。
1. 通过写明学习率关于迭代次数的表达式来指定
(1)LambdaLR
最原始也是最灵活的定义方式:
?
?参数
- optimizer:封装好的优化函数
- lr_lambda:计算学习率的函数
- last_epoch:标明学习率变化开始于哪一次迭代之后,默认为-1即从epoch=0开始
- verbose:bool值,是否在标准输出中打印相关信息,默认为False
(2)MultiplicativeLR
学习率每次的变化只是乘上一个系数,在学习率的表达式中只需指出这个系数:
参数
- optimizer:封装好的优化函数
- lr_lambda:学习率的表达式
- last_epoch:开始起作用的迭代,默认为-1
- verbose:bool值,是否在标准输出中打印相关信息,默认为False
(1)StepLR
每次迭代step_size轮之后,学习率变为原来的gamma倍。例如:
(2)MultiStepLR
这里面milestones是一个列表,每当迭代次数达到列表中的值时,学习率就变为原来的gamma倍。例如:
代在last_epoch之后的每一轮都变为原来的gamma倍。
这是一种根据验证过程中某个指标变化趋势进行调整的方法。例如我需要在验证过程中计算模型的准确率,当准确率连续5次没有下降时,第6次训练就降低学习率。
mode:取值’max’或’min’,被监测的指标需要达到最大or最小值
factor:当学习率改变时乘上的因子
patience:降低学习率前容忍指标没有变好的迭代次数
threshold, threshold_mode:当前结果与上一个学习率达到的最好结果相比较,确认学习率是否要变化
cooldown:学习率变化后,是否马上对观测指标进行监督,还是忽略刚刚变化的几轮迭代结果,默认是马上进行监督及cooldown=0
min_lr:学习率下降的最小值
epsilon:学习率每次变化的阈值
上面那个根据准确率accuracy改变学习率的代码,示例如下:
?
还有其它更为复杂的改变学习率的方式,如CosineAnnealingLR按cos曲线方式降低学习率,以及CyclicLR使学习率在一个给定的范围内变化而非单调递减。
参考资料:
GitHub?torch/optim/lr_scheduler.py
?