pytorch调节学习率方法
torch.optim.lr_scheduler
提供了几种根据epoch
调节学习率的方法。
学习率调整在optim
更新后,代码形式如下
>>> scheduler = ... # 设置scheduler
>>> for epoch in range(100):
>>> train(...) # 训练网络
>>> validate(...) # 验证网络
>>> scheduler.step() # 更新学习率
optimizer
通过param_group
来管理参数组。param_group
中保存了参数组及其对应的学习率,动量等等
导入所需的库
import torch
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
from matplotlib import pyplot as plt
1.LambdaLR
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
通过epoch
计算乘积因子与学习率lr
相乘作为新的学习率
参数:
- optimizer:设置好的优化器。
- lr_lambda:一个函数,根据整数的epoch计算乘积因子与学习率相乘;或者是一个关于函数的列表,每一个函数对应
optimizer.param_groups
相应的参数。 - last_epoch:最后一个
epoch
的索引,默认为-1。
model = AlexNet() # 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.05) # 优化器
lr_lambda = lambda epoch: 0.95 ** epoch # 函数2、
lr_list = []
scheduler = lr_scheduler.LambdaLR(optimizer,lr_lambda=lr_lambda)
for epoch in range(100):
scheduler.step() # 学习率更新
lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(lr_list)
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
2.StepLR
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
每固定步长用gamma
衰减各参数组的学习速率。这种衰减可能与来自该调度器外部的学习率变化同时发生。
参数:
- optimizer:设置好的优化器。
- step_size:学习率衰减步长
- gamma:衰减因子
- last_epoch:最后一个
epoch
的索引,默认为-1。
model = AlexNet() # 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.05) # 优化器
lr_list = []
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.9)
for epoch in range(100):
scheduler.step() # 学习率更新
lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(lr_list)
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
3.MultiStepLR
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
当epoch
进入milestones时,用gamma
衰减每个参数组的学习率。
参数:
- optimizer:设置好的优化器。
- milestones:epoch区间列表
- gamma:衰减因子
- last_epoch:最后一个
epoch
的索引,默认为-1。
model = AlexNet() # 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.05) # 优化器
lr_list = []
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[30, 80, 100], gamma=0.9)
for epoch in range(100):
scheduler.step() # 学习率更新
lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(lr_list)
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
4.ExponentialLR
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
在每一个epoch
学习率lr
都乘以衰减因子gamma
参数:
- optimizer:设置好的优化器。
- gamma:衰减因子
- last_epoch:最后一个
epoch
的索引,默认为-1。
model = AlexNet() # 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.05) # 优化器
lr_list = []
scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
for epoch in range(100):
scheduler.step() # 学习率更新
lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(lr_list)
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
5.CosineAnnealingLR
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
以余弦函数为周期,并在每个周期最大值时重新设置学习率。以初始学习率为最大学习率,以 2∗Tmax 为周期,在一个周期内先下降,后上升。
参数:
- optimizer:设置好的优化器。
- T_max:二分之一的周期值
- eta_min:最小的学习率,默认值为0
- last_epoch:最后一个
epoch
的索引,默认为-1。
model = AlexNet() # 训练模型
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 优化器
lr_list = []
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=20, eta_min=0.002)
for epoch in range(100):
scheduler.step() # 学习率更新
lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(lr_list)
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
6.ReduceLROnPlateau
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。
例如,当验证集的 loss 不再下降时,进行学习率调整;或者监测验证集的 accuracy,当accuracy 不再上升时,则调整学习率。
参数:
- optimizer:设置好的优化器。
- mode:
min
和max
两种模式,默认为min
。在min
模式,当监控变量不再减小时,减小学习率;在max
模式,当监控变量不再增加时减少学习率。 - factor:当减少学习率时,乘以factor。
- patience:默认值为10。忍受多少次指标不变化。
- verbose:默认值为False。每次更新后是否打印学习率信息
- threshold:默认值为0.0001,配合thershold_mode使用
- threshold_mode:有
rel
和abs
两种模式。
在rel
模式,当选择max
模式,动态阈值=best*(1+threshold),选择min
模式,动态阈值=best*(1-threshold)。
在abs
模式,当选择max
模式,动态阈值=best + threshold,选择min
模式,动态阈值=best-threshold。 - cooldown:改变学习率后等待多少epoch回到正常工作状态。
- min_lr:最小的允许lr
- eps:学习率的最小变化值,如果变化前后学习率的差值小于eps,则忽略此次更新。