这是我的代码
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
。尴尬的是,当您调用该警告仅在 3 个月前添加,因此在 v1.1.0 上不会有它。get_lr()
step()
函数时,您应该收到警告(如您在上面的实现中看到的那样(,而显然您没有。
为了完整起见,step()
方法的作用是将 1 添加到last_epoch
并通过调用get_lr()
函数来更新 LR(请参阅此处(:
self.last_epoch += 1
values = self.get_lr()