赞
踩
- import torch.optim as optim
- optimizer = optim.Adam(net.parameters(), lr=1e-3, betas=(0.9, 0.99))
在使用PyTorch训练神经网络时,可能需要根据情况调整学习率(learning rate)这个在梯度下降中的重要参数。PyTorch提供了scheduler工具包帮助实现这一功能。
1. 通过写明学习率关于迭代次数的表达式来指定
(1)LambdaLR
最原始也是最灵活的定义方式:
CLASS torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
参数
- lambdaa = lambda epoch : 0.5 ** (epoch // 30)
- scheduler = optim.lr_scheduler.LambdaLR(optimizer, lambdaa, last_epoch=29)
-
- for epoch in _ :
- train(...)
- validate(...)
- scheduler.step() # scheduler发挥作用的语法
学习率每次的变化只是乘上一个系数,在学习率的表达式中只需指出这个系数:
CLASS torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
参数
- lambdaa = lambda epoch : 0.5
- scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer, lambdaa)
-
- for epoch in _ :
- train(...)
- validate(...)
- scheduler.step()
CLASS torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)
每次迭代step_size轮之后,学习率变为原来的gamma倍。例如:
- scheduler = optim.lr_scheduler.StepLR(optimizer, 30)
-
- for epoch in _ :
- train(...)
- validate(...)
- scheduler.step()
CLASS torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
这里面milestones是一个列表,每当迭代次数达到列表中的值时,学习率就变为原来的gamma倍。例如:
- scheduler = optim.lr_scheduler.MultiStepLR(optimizer, [30, 80])
-
- for epoch in _ :
- train(...)
- validate(...)
- scheduler.step()
CLASS torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)
代在last_epoch之后的每一轮都变为原来的gamma倍。
- optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, \
- verbose=False, threshold=1e-4, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-8)
这是一种根据验证过程中某个指标变化趋势进行调整的方法。例如我需要在验证过程中计算模型的准确率,当准确率连续5次没有下降时,第6次训练就降低学习率。
mode:取值’max’或’min’,被监测的指标需要达到最大or最小值
factor:当学习率改变时乘上的因子
patience:降低学习率前容忍指标没有变好的迭代次数
threshold, threshold_mode:当前结果与上一个学习率达到的最好结果相比较,确认学习率是否要变化
cooldown:学习率变化后,是否马上对观测指标进行监督,还是忽略刚刚变化的几轮迭代结果,默认是马上进行监督及cooldown=0
min_lr:学习率下降的最小值
epsilon:学习率每次变化的阈值
上面那个根据准确率accuracy改变学习率的代码,示例如下:
- scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='max', factor=0.5, patience=5, min_lr=1e-6)
-
- for epoch in _ :
- train(...)
- validate(...)
- scheduler.step(accuracy)
还有其它更为复杂的改变学习率的方式,如CosineAnnealingLR按cos曲线方式降低学习率,以及CyclicLR使学习率在一个给定的范围内变化而非单调递减。
参考资料:
GitHub torch/optim/lr_scheduler.py
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。