1. 程式人生 > 實用技巧 >pytorch實現學習率衰減

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')

使用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')

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')

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')

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')

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

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