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,則忽略此次更新。