1.自我解释:torch.optim.lr_scheduler
官方给出了很多关于调整学习率的方法,但是调整学习率的时候一般会根据你所训练的次数,做出相应的调整,这是代码自动完成的。
学习率的调整应该在优化器更新之前,例如:官方给出的例子
model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, 0.1) #此为优化器初始化,采用SGD优化器,没有使用动量,收敛慢,容易陷入局部极值。
scheduler = ExponentialLR(optimizer, gamma=0.9) #此为学习率调整初始化
for epoch in range(20):
for input, target in dataset:
optimizer.zero_grad() #优化器初始化
output = model(input) #模型输入
loss = loss_fn(output, target)
loss.backward()
optimizer.step() #优化器更新
scheduler.step() #学习率调整更新
学习率一般是在初始训练数据时,学习率会大一点,然后随着训练次数的增加,学习率会慢下降,毕竟寻找极小值时候,不能步长太大。
2.官方给出了很多调整学习率的函数,例如:
#1》lr_scheduler.LambdaLR方法
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
此调整方法是在最开始进行数据训练时,学习率会乘以一个函数(在下理解为一个系数,只是分批次进行,例如每训练10次,lr=0.02,其他情况下,lr=0.01,最后几次,lr=lr_init),然后随着训练次数的增加,到达最后几次的时候,学习率调整为初始化时候的设定的参数值。
2》lr_scheduler.MultiplicativeLR的方法
torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
此方法与第一种方法差不多,只是此方法都是乘以一个固定的系数因子,例如lambda=0.95,在最后训练结束之前的几次又回归到初始设置的学习率,lr=lr_init。
3》lr_scheduler.StepLR方法
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)
上述最好的解释为:
假设初始化lr_init=0.05,epoch=130
当0<epoch<20时,lr=0.5
当20<epoch<40时,lr=0.05
当40<epoch<80时,lr=0.02
当80<epoch<120时,lr=0.01
当120<epoch<=130时,lr=0.05 #回归初始化设置
4》lr_scheduler.MultiStepLR方法
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
次法在上述基础上增加一个gamm=0.1的衰减系数,当epoch进入一个milestone时,lr=lr*0.1**epoch(在此处等号右边的lr是对应下面的 lr ,在不同区间,学习率 lr 不同)
当0<epoch<20时,lr=0.5
当20<epoch<40时,lr=0.05
当40<epoch<80时,lr=0.02
当80<epoch<120时,lr=0.01
(补充)在网络的不同卷积层次可以设置不同的学习率,例如:
import torch.optim as optim optimizer = optim.Adam([{'params':model.conv1.parameters(),'lr':0.05}, {'params':model.conv2.parameters(),'lr':0.02} ])
使用Adam优化器对网络训练时,卷积conv1采用的学习率 lr=0.05,在卷积con2中采用的学习率 lr=0.02 。
后续。。。(小琼)