当前位置:   article > 正文

pytorch笔记:调整学习率(torch.optim.lr_scheduler)_torch.optim.lr_scheduler.steplr

torch.optim.lr_scheduler.steplr

1 概述 

torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。

lr_scheduler调整策略举例

2.1 torch.optim.lr_scheduler.LambdaLR

  1. torch.optim.lr_scheduler.LambdaLR(
  2. optimizer,
  3. lr_lambda,
  4. last_epoch=-1)
  •      optimizer (Optimizer):要更改学习率的优化器
  •      lr_lambda(function or list):根据epoch计算λ的函数
  •      last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

更新策略

  • new_lr是得到的新的学习率
  • initial_lr是初始的学习率
  • λ是通过参数lr_lambda和epoch得到的
  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import LambdaLR
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.Adam(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 = LambdaLR(
  13. optimizer_1,
  14. lr_lambda=lambda epoch: 1/(epoch+1))
  15. print("初始化的学习率:", optimizer_1.defaults['lr'])
  16. for epoch in range(1, 11):
  17. optimizer_1.zero_grad()
  18. optimizer_1.step()
  19. print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
  20. scheduler_1.step()
  21. '''
  22. 初始化的学习率: 0.1
  23. 第1个epoch的学习率:0.100000
  24. 第2个epoch的学习率:0.050000
  25. 第3个epoch的学习率:0.033333
  26. 第4个epoch的学习率:0.025000
  27. 第5个epoch的学习率:0.020000
  28. 第6个epoch的学习率:0.016667
  29. 第7个epoch的学习率:0.014286
  30. 第8个epoch的学习率:0.012500
  31. 第9个epoch的学习率:0.011111
  32. 第10个epoch的学习率:0.010000
  33. '''
  34. plt.plot(lst)

 

 2.2 torch.optim.lr_scheduler.StepLR

  1. torch.optim.lr_scheduler.StepLR(
  2. optimizer,
  3. step_size,
  4. gamma=0.1,
  5. last_epoch=-1)
  •  optimizer (Optimizer):要更改学习率的优化器;
  • step_size(int):每训练step_size个epoch,更新一次参数;
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

更新策略:

        每过step_size个epoch,更新一次

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import StepLR
  4. initial_lr = 0.1
  5. net_1=nn.Sequential(
  6. nn.Linear(1,10)
  7. )
  8. optimizer_1 = torch.optim.Adam(
  9. net_1.parameters(),
  10. lr = initial_lr)
  11. scheduler_1 = StepLR(
  12. optimizer_1,
  13. step_size=3,
  14. gamma=0.1)
  15. print("初始化的学习率:", optimizer_1.defaults['lr'])
  16. lst=[]
  17. for epoch in range(1, 11):
  18. # train
  19. optimizer_1.zero_grad()
  20. optimizer_1.step()
  21. print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
  22. lst.append( optimizer_1.param_groups[0]['lr'])
  23. scheduler_1.step()
  24. '''
  25. 初始化的学习率: 0.1
  26. 第1个epoch的学习率:0.100000
  27. 第2个epoch的学习率:0.100000
  28. 第3个epoch的学习率:0.100000
  29. 第4个epoch的学习率:0.010000
  30. 第5个epoch的学习率:0.010000
  31. 第6个epoch的学习率:0.010000
  32. 第7个epoch的学习率:0.001000
  33. 第8个epoch的学习率:0.001000
  34. 第9个epoch的学习率:0.001000
  35. 第10个epoch的学习率:0.000100
  36. '''
  37. plt.plot(lst)

 

 2.3 torch.optim.lr_scheduler.MultiStepLR

  1. torch.optim.lr_scheduler.MultiStepLR(
  2. optimizer,
  3. milestones,
  4. gamma=0.1,
  5. last_epoch=-1)
  • optimizer (Optimizer):要更改学习率的优化器;
  • milestones(list):递增的list,存放要更新lr的epoch;
    • 在milestones里面的这几个点时相继乘以gamma系数
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

更新策略:

        每次遇到milestones中的epoch,做一次更新:

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. lst=[]
  6. initial_lr = 0.1
  7. net_1=nn.Sequential(
  8. nn.Linear(1,10)
  9. )
  10. optimizer_1 = torch.optim.Adam(
  11. net_1.parameters(),
  12. lr = initial_lr)
  13. scheduler_1 = MultiStepLR(
  14. optimizer_1,
  15. milestones=[3,9],
  16. gamma=0.1)
  17. print("初始化的学习率:", optimizer_1.defaults['lr'])
  18. for epoch in range(1, 11):
  19. # train
  20. optimizer_1.zero_grad()
  21. optimizer_1.step()
  22. print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
  23. lst.append( optimizer_1.param_groups[0]['lr'])
  24. scheduler_1.step()
  25. '''
  26. 初始化的学习率: 0.1
  27. 第1个epoch的学习率:0.100000
  28. 第2个epoch的学习率:0.100000
  29. 第3个epoch的学习率:0.100000
  30. 第4个epoch的学习率:0.010000
  31. 第5个epoch的学习率:0.010000
  32. 第6个epoch的学习率:0.010000
  33. 第7个epoch的学习率:0.010000
  34. 第8个epoch的学习率:0.010000
  35. 第9个epoch的学习率:0.010000
  36. 第10个epoch的学习率:0.001000
  37. '''
  38. plt.plot(lst)

 第三个和第九个epoch之后,学习率发生改变

2.4 torch.optim.lr_scheduler.ExponentialLR

  1. torch.optim.lr_scheduler.ExponentialLR(
  2. optimizer,
  3. gamma,
  4. last_epoch=-1)
  • optimizer (Optimizer):要更改学习率的优化器;
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

更新策略:

        每个epoch更新一次

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. lst=[]
  6. initial_lr = 0.1
  7. net_1=nn.Sequential(
  8. nn.Linear(1,10)
  9. )
  10. optimizer_1 = torch.optim.Adam(
  11. net_1.parameters(),
  12. lr = initial_lr)
  13. scheduler_1 =ExponentialLR(
  14. optimizer_1,
  15. gamma=0.1)
  16. print("初始化的学习率:", optimizer_1.defaults['lr'])
  17. for epoch in range(1, 11):
  18. # train
  19. optimizer_1.zero_grad()
  20. optimizer_1.step()
  21. print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
  22. lst.append( optimizer_1.param_groups[0]['lr'])
  23. scheduler_1.step()
  24. plt.plot(lst)
  25. '''
  26. 初始化的学习率: 0.1
  27. 第1个epoch的学习率:0.100000000
  28. 第2个epoch的学习率:0.010000000
  29. 第3个epoch的学习率:0.001000000
  30. 第4个epoch的学习率:0.000100000
  31. 第5个epoch的学习率:0.000010000
  32. 第6个epoch的学习率:0.000001000
  33. 第7个epoch的学习率:0.000000100
  34. 第8个epoch的学习率:0.000000010
  35. 第9个epoch的学习率:0.000000001
  36. 第10个epoch的学习率:0.000000000
  37. '''

 

2.5 torch.optim.lr_scheduler.CosineAnnealingLR

采用周期变化的策略调整学习率,能够使模型跳出在训练过程中遇到的局部最低点和鞍点

  1. torch.optim.lr_scheduler.CosineAnnealingLR(
  2. optimizer,
  3. T_max,
  4. eta_min=0,
  5. last_epoch=-1)
  • optimizer (Optimizer):要更改学习率的优化器;
  • T_max(int):lr的变化是周期性的,T_max是周期的1/2
  • eta_min(float):lr的最小值,默认为0;
  • last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

更新策略:

这时候learning rate的取值范围是[eta_min,initial_lr]

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import CosineAnnealingLR
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.Adam(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 = CosineAnnealingLR(
  13. optimizer_1,
  14. T_max=20)
  15. print("初始化的学习率:", optimizer_1.defaults['lr'])
  16. lst=[]
  17. for epoch in range(1, 101):
  18. # train
  19. optimizer_1.zero_grad()
  20. optimizer_1.step()
  21. lst.append(optimizer_1.param_groups[0]['lr'])
  22. #print("第%d个epoch的学习率:%.9f" % (epoch, optimizer_1.param_groups[0]['lr']))
  23. scheduler_1.step()
  24. plt.plot(lst)

2.6 MultiplicativeLR

  1. torch.optim.lr_scheduler.MultiplicativeLR(optimizer,
  2. lr_lambda,
  3. last_epoch=-1,
  4. verbose=False,)

 

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import MultiplicativeLR
  4. initial_lr = 0.1
  5. net_1=nn.Sequential(
  6. nn.Linear(1,10)
  7. )
  8. optimizer_1 = torch.optim.Adam(
  9. net_1.parameters(),
  10. lr = initial_lr)
  11. scheduler_1 = MultiplicativeLR(
  12. optimizer_1,
  13. lr_lambda=lambda epoch: 1/(epoch+1))
  14. print("初始化的学习率:", optimizer_1.defaults['lr'])
  15. lst=[]
  16. for epoch in range(1, 11):
  17. optimizer_1.zero_grad()
  18. optimizer_1.step()
  19. print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
  20. lst.append( optimizer_1.param_groups[0]['lr'])
  21. scheduler_1.step()
  22. '''
  23. 初始化的学习率: 0.1
  24. 第1个epoch的学习率:0.100000
  25. 第2个epoch的学习率:0.050000
  26. 第3个epoch的学习率:0.016667
  27. 第4个epoch的学习率:0.004167
  28. 第5个epoch的学习率:0.000833
  29. 第6个epoch的学习率:0.000139
  30. 第7个epoch的学习率:0.000020
  31. 第8个epoch的学习率:0.000002
  32. 第9个epoch的学习率:0.000000
  33. 第10个epoch的学习率:0.000000
  34. '''
  35. plt.plot(lst)

 

2.7 CyclicLR

学习率周期性变化。

base_lr循环中学习率的下边界
max_lr循环中学习率的上边界
step_size_up学习率上升的步数
step_size_down学习率下降的步数
mode{triangular, triangular2, exp_range}中的一个。默认: 'triangular'
gamma (float)在mode='exp_range'时,gamma**(cycle iterations), 默认:1.0

2.7.1 triangular

最基本的模式,学习率会在base_lr(最小学习率)和max_lr(最大学习率)之间周期性地进行线性往返变化

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.SGD(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 =CyclicLR(
  13. optimizer_1,
  14. base_lr=0.1,
  15. max_lr=10,
  16. step_size_up=10,
  17. step_size_down=5,
  18. mode='triangular')
  19. lst=[]
  20. for epoch in range(1, 101):
  21. # train
  22. optimizer_1.zero_grad()
  23. optimizer_1.step()
  24. lst.append( optimizer_1.param_groups[0]['lr'])
  25. scheduler_1.step()
  26. plt.plot(lst)

 

2.7.2 triangular2

每个循环的最大学习率会比前一个循环的最大学习率低一半,从而使学习率的变化范围随着时间的推移而收缩

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.SGD(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 =CyclicLR(
  13. optimizer_1,
  14. base_lr=0.1,
  15. max_lr=10,
  16. step_size_up=10,
  17. step_size_down=5,
  18. mode='triangular2')
  19. lst=[]
  20. for epoch in range(1, 101):
  21. # train
  22. optimizer_1.zero_grad()
  23. optimizer_1.step()
  24. lst.append( optimizer_1.param_groups[0]['lr'])
  25. scheduler_1.step()
  26. plt.plot(lst)

 

2.7.3 exp_range

学习率随着时间的推移而减小,最大学习率会根据gamma参数指数减少

  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.SGD(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 =CyclicLR(
  13. optimizer_1,
  14. base_lr=0.1,
  15. max_lr=10,
  16. step_size_up=10,
  17. step_size_down=5,
  18. mode='exp_range',
  19. gamma=0.9)
  20. lst=[]
  21. for epoch in range(1, 101):
  22. # train
  23. optimizer_1.zero_grad()
  24. optimizer_1.step()
  25. lst.append( optimizer_1.param_groups[0]['lr'])
  26. scheduler_1.step()
  27. plt.plot(lst)

 

2.8 CosineAnnealingWarmRestarts

使用余弦退火计划设置每个参数组的学习速率,并在 Ti epoch 后重启

T_0第一次restartepoch的数值
T_mult

每次restart后,学习率restart周期增加因子

t_{i+1}=t_i * T_{mult}

eta_min最小的学习率,默认值为0
  1. import torch
  2. import torch.nn as nn
  3. from torch.optim.lr_scheduler import *
  4. import matplotlib.pyplot as plt
  5. initial_lr = 0.1
  6. net_1=nn.Sequential(
  7. nn.Linear(1,10)
  8. )
  9. optimizer_1 = torch.optim.SGD(
  10. net_1.parameters(),
  11. lr = initial_lr)
  12. scheduler_1 =CosineAnnealingWarmRestarts(
  13. optimizer_1,
  14. T_0=10,
  15. T_mult=2,
  16. eta_min=1)
  17. lst=[]
  18. for epoch in range(1, 101):
  19. # train
  20. optimizer_1.zero_grad()
  21. optimizer_1.step()
  22. lst.append( optimizer_1.param_groups[0]['lr'])
  23. scheduler_1.step()
  24. plt.plot(lst)

 

 参考文献:torch.optim.lr_scheduler:调整学习率_qyhaill的博客-CSDN博客_lr_scheduler

图解 9 种Torch中常用的学习率调整策略 (qq.com)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/328452
推荐阅读
相关标签
  

闽ICP备14008679号