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通过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()每固定步长用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()当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()在每一个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()以余弦函数为周期,并在每个周期最大值时重新设置学习率。以初始学习率为最大学习率,以 2∗Tmax 为周期,在一个周期内先下降,后上升。 参数:
optimizer:设置好的优化器。T_max:二分之一的周期值eta_min:最小的学习率,默认值为0last_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()当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。 例如,当验证集的 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:最小的允许lreps:学习率的最小变化值,如果变化前后学习率的差值小于eps,则忽略此次更新。