pytorch优化器及学习率

学习率衰减

可以通过打印optimizer,查看里面的具体参数,网络各层的学习率,权重衰减。另外,学习率更新一般是一个epoch更新一次,所以要放在optimizer.step()的上一级。

StepLR

scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
scheduler.step()  
print(epoch, 'lr={:.6f}'.format(scheduler.get_lr()[0]))#查看学习率

for example

0<epoch<30, lr = 0.05
30<=epoch<60, lr = 0.005
60<=epoch<90, lr = 0.0005

MultiStepLR

scheduler = lr_scheduler.MultiStepLR(optimizer, [30, 80], 0.1)#与StepLR相比,MultiStepLR可以设置指定的区间
scheduler.step()  

ExponentialLR

scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
scheduler.step()

优化器

Adam

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
#params(iterable):可用于迭代优化的参数或者定义参数组的dicts。
#lr (float, optional) :学习率(默认: 1e-3)
#betas (Tuple[float, float], optional):用于计算梯度的平均和平方的系数(默认: (0.9, 0.999))
#eps (float, optional):为了提高数值稳定性而添加到分母的一个项(默认: 1e-8)
#weight_decay (float, optional):权重衰减(如L2惩罚)(默认: 0)

SGD

optim.SGD(net.parameters(), lr=opt.lr, momentum=0.9,weight_decay=5e-4)

adam和加入动量的sgd中收敛结果一样,但是sgd动量为0的优化器收敛效果较差。
待续---------------time2020/1/7