有的時候需要我們通過一定機制來調整學習率,這個時候可以借助於torch.optim.lr_scheduler類來進行調整;一般地有下面兩種調整策略:(通過兩個例子來展示一下)
兩種機制:LambdaLR機制和StepLR機制;
(1)LambdaLR機制:
optimizer_G = torch.optim.Adam([{'params' : optimizer_G.parameters() , 'initial_lr' : train_opt.lr}] , lr = train_opt.lr , betas = (train_opt.betal , 0.999))
lambda_G = lambda epoch : 0.5 ** (epoch // 30)
schduler_G = torch.optim.lr_scheduler.LambdaLR(optimizer_G.parameters() , lambda_G , last_epoch = 29);
scheduler.step()
lr = schduler.get_lr()[0]; //這里記得加一個[0]的索引!
for param_group in optimizer_G.param_groups():
param_group['lr'] = lr
解釋:last_epoch是開始的前一個epoch的索引值,這里為29表示從epoch = 30開始(其中scheduler類中的epoch從last_epoch + 1開始,每次step操作epoch加1),學習率調整為lr * (0.5 ** (epoch // 30));另外注意的是:定義optimizer_G類時,需要寫成上述那種形式,不要寫成以前常見的“optimizer_G = torch.optim.Adam(params = optimizer_G.parameters()...)”,要像這里一樣寫成字典形式;否則lr_scheduler類會報“沒有initial_lr的錯誤”
(2)StepLR機制:
schduler_G = torch.optim.lr_scheduler.StepLR(optimizer_G.parameters() , step_size = 30 , gamma = 0.1 , last_epoch = 29)
其他的和上面類似,這里的調整策略如下: