概述
pytorch中既自带了学习率函数,我们也可以自定义学习率调整函数。调整函数通常随epoch的变化而变化。首先实现自定义学习率调整:
自定义学习率调整
以SGDR余弦学习率调整为例:
论文地址:https://arxiv.org/abs/1608.03983
在pytorch中的训练代码:
# 第epoch值进行计算并更新学习率
def adjust_lr(optimizer, epoch, T_0=10, eta_max=0.1, eta_min=0.):
if T_mul == 2:
i = np.log2(epoch / T_0 + 1).astype(np.int)
T_cur = epoch - T_0 * (T_mult ** (i) - 1)
T_i = (T_0 * T_mult ** i)
elif T_mul == 1:
T_cur = epoch % T_0
T_i = T_0
cur_lr = eta_min + 0.5 * (eta_max - eta_min) * (1 + np.cos(np.pi * T_cur / T_i))
for param_group in optimizer.param_groups:
param_group['lr'] = cur_lr
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=1e-4, nesterov=True)
for epoch in range(100):
adjust_lr(optimizer, epoch)
train()
Note: optimizer.param_groups保存为了优化器的参数信息,为一个列表,但是只有一个字典元素,字典里面具有参数信息。
pytorch自带的学习率函数
文档链接:https://pytorch.org/docs/stable/optim.html#torch.optim.lr_scheduler.CosineAnnealingLR
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=1e-4, nesterov=True)
lr_schduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=300, eta_min=0)
for epoch in range(100):
lr_schduler.step(epoch)
train()
常用的学习率调整策略还有:
(1)torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, las
t_epoch=-1)
- step_size(int)- 学习率下降间隔数,若为 30,则会在 30、 60、 90…个 step 时,将学习率调整为 lr*gamma。
- gamma(float)- 学习率调整倍数,默认为 0.1 倍,即下降 10 倍。
- last_epoch:表示上一轮是那个,接着上一轮继续开始
(2)torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma
=0.1, last_epoch=-1)
- milestones(list)- 一个 list,每一个元素代表何时调整学习率, list 元素必须是递增的。如 milestones=[30,80,120]
最后
以上就是无限舞蹈为你收集整理的Pytorch中的SGDR的全部内容,希望文章能够帮你解决Pytorch中的SGDR所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复