PyTorch常用学习率调整策略
- 1. torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)
- 2.torch.optim.lr_scheduler.MultiplicativeLR(*optimizer*, *lr_lambda*, *last_epoch=- 1*, *verbose=False*)
- 3. torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=- 1, verbose=False)
- 4. torch.optim.lr_scheduler.MultiStepLR(*optimizer*, *milestones*, *gamma=0.1*, *last_epoch=- 1*, *verbose=False*)
- 5.torch.optim.lr_scheduler.ExponentialLR(*optimizer*, *gamma*, *last_epoch=- 1*, *verbose=False*)
- 6. torch.optim.lr_scheduler.CosineAnnealingLR(*optimizer*, *T_max*, *eta_min=0*, *last_epoch=- 1*, *verbose=False*)
- 7. torch.optim.lr_scheduler.ReduceLROnPlateau(*optimizer*, *mode='min'*, *factor=0.1*, *patience=10*, *threshold=0.0001*, *threshold_mode='rel'*, *cooldown=0*, *min_lr=0*, *eps=1e-08*, *verbose=False*)
神经网络在进行参数优化的过程中,经常需要对学习率进行动态调整。那么PyTorch的torch.optim.lr_scheduler接口提供了很多策略实现动态调整。我们选取一些常用的进行介绍。
1. torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)
Sets the learning rate of each parameter group to the initial lr times a given function.
这个策略也比较简单,就是每次调用scheduler.step()之后,新的lr会乘以lr_lambda的结果。举例如下,其中network可以换成我们要优化的模型:
optim = torch.optim.Adam(network.parameters(), lr=0.001)
lf = lambda x: ((1 + math.cos(x * math.pi / num_epochs)) / 2) * (1 - 0.2) + 0.2
scheduler = torch.optim.lr_scheduler.LambdaLR(optim, lr_lambda=lf)
for epoch in range(10):
optim.step()
scheduler.step()
print(scheduler.get_last_lr())
输出结果如下:
[0.0009804226065180616]
[0.0009236067977499791]
[0.0008351141009169894]
[0.0007236067977499789]
[0.0006000000000000001]
[0.00047639320225002107]
[0.00036488589908301085]
[0.0002763932022500211]
[0.00021957739348193862]
[0.0002]
可以看到每次调用step之后,lr = lr * lr_lambda(epoch)。
2.torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)
Multiply the learning rate of each parameter group by the factor given in the specified fu