关于 pytorch 学习速率调度程序



这是我的代码

optimizer = optim.SGD(net.parameters(), lr=0.1)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5)
for i in range(15):
lr = scheduler.get_lr()[0]
lr1 = optimizer.param_groups[0]["lr"]
print(i, lr, lr1)
scheduler.step()

这是结果

0 0.1 0.1
1 0.1 0.1
2 0.1 0.1
3 0.1 0.1
4 0.1 0.1
5 0.025 0.05
6 0.05 0.05
7 0.05 0.05
8 0.05 0.05
9 0.05 0.05
10 0.0125 0.025
11 0.025 0.025
12 0.025 0.025
13 0.025 0.025
14 0.025 0.025

我们可以看到,当应用scheduler.step()时,学习率首先降低 0.25 倍,然后反弹到 0.5 倍。是scheduler.get_lr()LR的问题还是scheduler.step()的问题

关于环境

  • python=3.6.9
  • PyTorch=1.1.0

此外,当使用 pytorch=0.4.1 时,我找不到这个问题。

是的,"问题"在于使用get_lr()。要获得当前的 LR,您需要的实际上是get_last_lr().


如果您看一下实现:

def get_lr(self):
if not self._get_lr_called_within_step:
warnings.warn("To get the last learning rate computed by the scheduler, "
"please use `get_last_lr()`.", UserWarning)
if (self.last_epoch == 0) or (self.last_epoch % self.step_size != 0):
return [group['lr'] for group in self.optimizer.param_groups]
return [group['lr'] * self.gamma
for group in self.optimizer.param_groups]

当它在step=5中时,它不满足条件(因为step_size=5(,它将返回lr * gamma尴尬的是,当您调用get_lr()step()函数时,您应该收到警告(如您在上面的实现中看到的那样(,而显然您没有。该警告仅在 3 个月前添加,因此在 v1.1.0 上不会有它。

为了完整起见,step()方法的作用是将 1 添加到last_epoch并通过调用get_lr()函数来更新 LR(请参阅此处(:

self.last_epoch += 1
values = self.get_lr()

最新更新