pytorch学习率调整详解

pytorch中既自带了学习率函数,我们也可以自定义学习率调整函数。调整函数通常随epoch的变化而变化。首先实现自定义学习率调整:

自定义学习率调整

以SGDR余弦学习率调整为例:
论文地址:https://arxiv.org/abs/1608.03983
使用 T 0 , T m u l t T_{0},T_{mult} T0,Tmult的策略,初始为 T 0 T_{0} T0个epoch为一个学习率调整周期,之后的周期是前一个周期epoch的 T m u l t T_{mult} Tmult倍。对于一个学习率周期 i i i,假设有 T i T_{i} Ti个epoch,当前所处的位置为第 T c u r T_{cur} Tcur个epoch,则当前epoch的学习率为:
η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + cos ⁡ ( T c u r T i π ) ) \eta_{t}=\eta_{min}+\frac{1}{2}(\eta_{max}-\eta_{min})(1+\cos(\frac{T_{cur}}{T_{i}}\pi)) ηt=ηmin+21(ηmaxηmin)(1+cos(TiTcurπ))
对于 T 0 = 10 , T m u l t = 2 T_{0}=10,T_{mult=2} T0=10,Tmult=2,设训练100个epoch,则对应的学习率变化曲线为:
在这里插入图片描述
在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自带的学习率函数

pytorch的torch.optim.lr_scheduler模块提供了许多基于epoch 的学习率函数。以SGDR中的 T m u l t = 1 T_{mult}=1 Tmult=1余弦学习率调整函数为例进行讲解使用如何调用pytorch中的学习率函数。Moreover,pytorch只提供了 T m u l t = 1 T_{mult}=1 Tmult=1情况下的SGDR的学习率调整,故在上文我们手工实现了更general的调整。
文档链接: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]
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页