记录一下schedule设置学习率变化过程的使用和方法
优化器optimizer
pytorch提供数种优化器的实现,优化器根据计算图的结构,进行梯度计算,根据loss信息实现自动的BP过程。常用的就是Adam
,将网络参数传入,设置初始的learning-rate
学习率即可:
optimizer = torch.optim.Adam(model.parameters(), lr=args.learn_rate)
在训练中:
optimizer.zero_grad()
loss.backward()
optimizer.step()
即可实现BP环节。
scheduler
lr_scheduler
提供了随着训练的迭代次数对optimizer的学习率进行修改的类和方法,通过在循环过程中调用:
scheduler.step()
每次调用step方法,类中内置的计数器就会+1,即epoch
轮次数增加。根据不同的当前epoch
,scheduler类会对optimizer中的learning-rate进行修改。利用optimizer.param_groups[0]['lr']
可查看当前的学习率大小。
这边整理三个常用的类:LambdaLR,StepLR和MultiStepLR。个人觉得这三种就能应对大部分的调整需求了。
LambdaLR
完整的类包为torch.optim.lr_scheduler.LambdaLR
。该类实现的学习率变化策略为当前学习率乘以值λ
,λ
的大小由一个自定函数确定,该函数输入为epoch,即类中的循环次数计数(也就是调用scheduler.step()
的次数)。
learing-rate = λ * learing-rate
LambdaLR(optimizer, lr_lambda, last_epoch=-1)
其中lr_lambda
为λ的计算函数。
给个使用例子:
# 简单写个Moudle生成parameter
class MyModel