torch.optim.lr_scheduler
模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。
torch.optim.lr_scheduler.LambdaLR(
optimizer,
lr_lambda,
last_epoch=-1)
更新策略
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
'''
torch.optim.lr_scheduler.StepLR(
optimizer,
step_size,
gamma=0.1,
last_epoch=-1)
更新策略:
每过step_size个epoch,更新一次
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
'''
torch.optim.lr_scheduler.MultiStepLR(
optimizer,
milestones,
gamma=0.1,
last_epoch=-1)
更新策略:
每次遇到milestones
中的epoch,做一次更新:
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之后,学习率发生改变
torch.optim.lr_scheduler.ExponentialLR(
optimizer,
gamma,
last_epoch=-1)
更新策略:
每个epoch更新一次
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
'''
采用周期变化的策略调整学习率,能够使模型跳出在训练过程中遇到的局部最低点和鞍点
torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max,
eta_min=0,
last_epoch=-1)
更新策略:
这时候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)
参考文献:torch.optim.lr_scheduler:调整学习率_qyhaill的博客-CSDN博客_lr_scheduler