torch.optim是一个用于实现优化算法的包,支持常见的优化算法。本文介绍一下这个包下面的一些常见内容,如optimizer和lr_scheduler的构造和使用。
optimizer用于根据已得到的梯度来更新网络参数。
optimizer(优化器)的构造:
构造优化器需要传入一个包含要学习参数的迭代器,此外还有一些学习策略参数如学习率等。
以常用的两个优化器SGD和Adam为例:
optimizer(优化器)的属性或方法:
optimizer也有state_dict(),其中包含两部分:
输出:
也可以这样来查看
优化器也可以对不同的层制定不同的优化器参数如学习率等。
eg:
上面例子中默认的学习率和动量为0.01和0.9,而classifier的学习率单独设置为了0.001.
注意:如果要将模型转到GPU中,即调用.cuda(),那么构造optimizer要放在model.cuda()之后,因为模型转到GPU后其参数会不同。
举一个较综合、详细的例子:
上述示例未加入lr_scheduler,可以将上面单个周期的训练封装,一个周期内包括训练和验证两部分,这两部分大体内容相同,然后每一个周期之后调用scheduler.step()。
调整学习率:
torch.optim.lr_scheduler提供了几种根据epoch数调整学习率的方法。
torch.optim.lr_scheduler.ReduceLROnPlateau允许基于某些验证度量来动态降低学习率。
lr_scheduler也有state_dict(),以dict的形式返回scheduler的状态。
其使用时的一般形式为:
注意优化器的step()要在scheduler的step()之前。
这里主要介绍两种,
第一类:
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
optimizer (Optimizer) – 封装的optimizer.
lr_lambda (function or list) – 一个关于epoch的计算函数, 如果optimizer.param_groups中有多个需要优化的参数组,那么这里就有一个由多个计算函数组成的list。
last_epoch (int) – 最后一个epoch的值. 默认: -1.
verbose (bool) – 如果为True打印输出每次更新的值,默认为Fasle。
示例:
第二类:
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)
step_size (int) – 多少个epoch后开始学习率decay
gamma (float) – 学习率衰退的因子,默认 0.1。每次衰退时乘以这个。
示例:
文章主要参考pytorch官方文档。