pytorch實現學習率衰減


pytorch實現學習率衰減

手動修改optimizer中的lr

使用for循環來手動人工進行learning rate的衰減

model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
lr_list = []
for epoch in range(100):
    if epoch % 5 == 0:
        for p in optimizer.param_groups:
            p['lr'] *= 0.9#注意這里
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')
image-20200914211815982

使用lr_scheduler

LambdaLR——lambda函數衰減

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)

lr_lambda 會接收到一個int參數:epoch,然后根據epoch計算出對應的lr。如果設置多個lambda函數的話,會分別作用於Optimizer中的不同的params_group

import numpy as np 
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)

lambda1 = lambda epoch:np.sin(epoch) / epoch
scheduler = lr_scheduler.LambdaLR(optimizer,lr_lambda = lambda1)

for epoch in range(100):
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')
image-20200914212214994

StepLR——階梯式衰減

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

每個一定的epoch,lr會自動乘以gamma進行階梯式衰減

⭐⭐⭐注意:pytorch1.1.0之后scheduler.step()要放在optimizer.step()之后!!!

lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
scheduler = lr_scheduler.StepLR(optimizer,step_size=5,gamma = 0.8)
for epoch in range(100):
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')
image-20200914213252927

MultiStepLR——多階梯式衰減

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

三段式lr,epoch進入milestones范圍內即乘以gamma,離開milestones范圍之后再乘以gamma。這種衰減方式也是在學術論文中最常見的方式,一般手動調整也會采用這種方法。

lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
scheduler = lr_scheduler.MultiStepLR(optimizer,milestones=[20,80],gamma = 0.9)
for epoch in range(100):
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100),lr_list,color = 'r')
image-20200914213738384

ExponentialLR——指數連續衰減

torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

每個epoch中lr都乘以gamma

lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(),lr = LR)
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(range(100),lr_list,color = 'r')
image-20200914214232247

CosineAnnealingLR——余弦退火衰減

 torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

T_max 對應1/2個cos周期所對應的epoch數值

eta_min 為最小的lr值,默認為0

image-20200914214534397

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不再降低或者acc不再提高之后,降低學習率。

各參數意義如下:

mode:'min'模式檢測metric是否不再減小,'max'模式檢測metric是否不再增大;

factor: 觸發條件后lr*=factor;

patience:不再減小(或增大)的累計次數;

verbose:觸發條件后print;

threshold:只關注超過閾值的顯著變化;

threshold_mode:有rel和abs兩種閾值計算模式,rel規則:max模式下如果超過best(1+threshold)為顯著,min模式下如果低於best(1-threshold)為顯著;abs規則:max模式下如果超過best+threshold為顯著,min模式下如果低於best-threshold為顯著;

cooldown:觸發一次條件后,等待一定epoch再進行檢測,避免lr下降過速;

min_lr:最小的允許lr;

eps:如果新舊lr之間的差異小與1e-8,則忽略此次更新。

參考:https://www.jianshu.com/p/9643cba47655


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM