PyTorch: 如何在任何给定时刻(没有 LR 调度)更改优化器的学习速率

在 PyTorch,有没有可能在训练中动态地改变优化器的学习速度(我不想事先定义一个学习速度表) ?

假设我有一个优化器:

optim = torch.optim.SGD(model.parameters(), lr=0.01)

现在由于一些测试,我执行在训练期间,我意识到我的学习率太高,所以我想改变它说 0.001。似乎没有一个方法 optim.set_lr(0.001),但有什么方法可以做到这一点?

72653 次浏览

所以学习率存储在 optim.param_groups[i]['lr']中。 optim.param_groups是一个不同体重组别的列表,可以有不同的学习速度。因此,简单地做:

for g in optim.param_groups:
g['lr'] = 0.001

会有用的。


或者

正如评论中提到的,如果你的学习速度只取决于纪元数,你可以使用 学习速率调度程序

例如(来自 doc 的修改过的示例) :

torch.optim.lr_scheduler import LambdaLR
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
# Assuming optimizer has two groups.
lambda_group1 = lambda epoch: epoch // 30
lambda_group2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
train(...)
validate(...)
scheduler.step()

此外,还有一个预构建的学习速率调度器,可以在高原上减少学习速率。

不用在 Patapouf _ ai 的回答中循环,你可以直接通过:

optim.param_groups[0]['lr'] = 0.001