天天看點

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例

1 概述 

torch.optim.lr_scheduler

子產品提供了一些根據epoch訓練次數來調整學習率(learning rate)的方法。一般情況下我們會設定随着epoch的增大而逐漸減國小習率進而達到更好的訓練效果。

2 lr_scheduler調整政策舉例

2.1 torch.optim.lr_scheduler.LambdaLR

torch.optim.lr_scheduler.LambdaLR(
    optimizer, 
    lr_lambda, 
    last_epoch=-1)
           
  •      optimizer (Optimizer):要更改學習率的優化器
  •      lr_lambda(function or list):根據epoch計算λ的函數
  •      last_epoch (int):最後一個epoch的index,如果是訓練了很多個epoch後中斷了,繼續訓練,這個值就等于加載的模型的epoch。預設為-1表示從頭開始訓練,即從epoch=1開始。

更新政策

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例
  • new_lr是得到的新的學習率
  • initial_lr是初始的學習率
  • λ是通過參數lr_lambda和epoch得到的
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LambdaLR

initial_lr = 0.1

net_1=nn.Sequential(
    nn.Linear(1,10)
)

optimizer_1 = torch.optim.Adam(
    net_1.parameters(), 
    lr = initial_lr)

scheduler_1 = LambdaLR(
    optimizer_1, 
    lr_lambda=lambda epoch: 1/(epoch+1))

print("初始化的學習率:", optimizer_1.defaults['lr'])

for epoch in range(1, 11):
    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d個epoch的學習率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

'''
初始化的學習率: 0.1
第1個epoch的學習率:0.100000
第2個epoch的學習率:0.050000
第3個epoch的學習率:0.033333
第4個epoch的學習率:0.025000
第5個epoch的學習率:0.020000
第6個epoch的學習率:0.016667
第7個epoch的學習率:0.014286
第8個epoch的學習率:0.012500
第9個epoch的學習率:0.011111
第10個epoch的學習率:0.010000
'''
           

 2.2 torch.optim.lr_scheduler.StepLR

torch.optim.lr_scheduler.StepLR(
    optimizer, 
    step_size, 
    gamma=0.1, 
    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,更新一次

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import StepLR

initial_lr = 0.1

net_1=nn.Sequential(
    nn.Linear(1,10)
)

optimizer_1 = torch.optim.Adam(
    net_1.parameters(), 
    lr = initial_lr)

scheduler_1 = StepLR(
    optimizer_1, 
    step_size=3, 
    gamma=0.1)

print("初始化的學習率:", optimizer_1.defaults['lr'])

for epoch in range(1, 11):
    # train

    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d個epoch的學習率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

'''
初始化的學習率: 0.1
第1個epoch的學習率:0.100000
第2個epoch的學習率:0.100000
第3個epoch的學習率:0.100000
第4個epoch的學習率:0.010000
第5個epoch的學習率:0.010000
第6個epoch的學習率:0.010000
第7個epoch的學習率:0.001000
第8個epoch的學習率:0.001000
第9個epoch的學習率:0.001000
第10個epoch的學習率:0.000100
'''
           

 2.3 torch.optim.lr_scheduler.MultiStepLR

torch.optim.lr_scheduler.MultiStepLR(
    optimizer,
    milestones, 
    gamma=0.1, 
    last_epoch=-1)
           
  • optimizer (Optimizer):要更改學習率的優化器;
  • milestones(list):遞增的list,存放要更新lr的epoch;
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最後一個epoch的index,如果是訓練了很多個epoch後中斷了,繼續訓練,這個值就等于加載的模型的epoch。預設為-1表示從頭開始訓練,即從epoch=1開始。

更新政策:

        每次遇到

milestones

中的epoch,做一次更新:

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import MultiStepLR

initial_lr = 0.1

net_1=nn.Sequential(
    nn.Linear(1,10)
)

optimizer_1 = torch.optim.Adam(
    net_1.parameters(), 
    lr = initial_lr)

scheduler_1 =  MultiStepLR(
    optimizer_1, 
    milestones=[3, 9], 
    gamma=0.1)

print("初始化的學習率:", optimizer_1.defaults['lr'])

for epoch in range(1, 11):
    # train

    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d個epoch的學習率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

'''
初始化的學習率: 0.1
第1個epoch的學習率:0.100000
第2個epoch的學習率:0.100000
第3個epoch的學習率:0.100000
第4個epoch的學習率:0.010000
第5個epoch的學習率:0.010000
第6個epoch的學習率:0.010000
第7個epoch的學習率:0.010000
第8個epoch的學習率:0.010000
第9個epoch的學習率:0.010000
第10個epoch的學習率:0.001000
'''
           

 第三個和第九個epoch之後,學習率發生改變

2.4 torch.optim.lr_scheduler.ExponentialLR

torch.optim.lr_scheduler.ExponentialLR(
    optimizer, 
    gamma, 
    last_epoch=-1)
           
  • optimizer (Optimizer):要更改學習率的優化器;
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最後一個epoch的index,如果是訓練了很多個epoch後中斷了,繼續訓練,這個值就等于加載的模型的epoch。預設為-1表示從頭開始訓練,即從epoch=1開始。

更新政策:

        每個epoch更新一次

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import ExponentialLR

initial_lr = 0.1

net_1=nn.Sequential(
    nn.Linear(1,10)
)

optimizer_1 = torch.optim.Adam(
    net_1.parameters(), 
    lr = initial_lr)

scheduler_1 =  ExponentialLR(
    optimizer_1, 
    gamma=0.1)

print("初始化的學習率:", optimizer_1.defaults['lr'])

for epoch in range(1, 11):
    # train

    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d個epoch的學習率:%.9f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

'''
初始化的學習率: 0.1
第1個epoch的學習率:0.100000000
第2個epoch的學習率:0.010000000
第3個epoch的學習率:0.001000000
第4個epoch的學習率:0.000100000
第5個epoch的學習率:0.000010000
第6個epoch的學習率:0.000001000
第7個epoch的學習率:0.000000100
第8個epoch的學習率:0.000000010
第9個epoch的學習率:0.000000001
第10個epoch的學習率:0.000000000
'''
           

2.5 torch.optim.lr_scheduler.CosineAnnealingLR

torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer, 
    T_max, 
    eta_min=0, 
    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開始。

更新政策:

pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例

這時候learning rate的取值範圍是[eta_min,initial_lr]

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import CosineAnnealingLR
import matplotlib.pyplot as plt

initial_lr = 0.1

net_1=nn.Sequential(
    nn.Linear(1,10)
)

optimizer_1 = torch.optim.Adam(
    net_1.parameters(), 
    lr = initial_lr)

scheduler_1 = CosineAnnealingLR(
    optimizer_1, 
    T_max=20)

print("初始化的學習率:", optimizer_1.defaults['lr'])

lst=[]
for epoch in range(1, 101):
    # train

    optimizer_1.zero_grad()
    optimizer_1.step()
    lst.append(optimizer_1.param_groups[0]['lr'])
    #print("第%d個epoch的學習率:%.9f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

plt.plot(lst)
           
pytorch筆記:調整學習率(torch.optim.lr_scheduler)1 概述 2 lr_scheduler調整政策舉例

 參考文獻:torch.optim.lr_scheduler:調整學習率_qyhaill的部落格-CSDN部落格_lr_scheduler

繼續閱讀