pytorch调节学习率方法

    技术2025-02-17  21

    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:最小的学习率,默认值为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()

    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:最小的允许lreps:学习率的最小变化值,如果变化前后学习率的差值小于eps,则忽略此次更新。

    参考资料

    pytorch官方手册https://www.jianshu.com/p/9643cba47655https://blog.csdn.net/shanglianlm/article/details/85143614
    Processed: 0.014, SQL: 9