在PyTorch中是否可以在训练过程中动态地改变优化器的学习速率(我不想事先定义学习速率时间表)?假设我有一个优化器:
optim = torch.optim.SGD(model.parameters(), lr=0.01)
现在由于我在训练中进行的一些测试,我意识到我的学习率太高了,所以我想把它改为0.001。似乎没有方法optim.set_lr(0.001),但有什么方法可以做到这一点吗?
0.001
optim.set_lr(0.001)
2lpgd9681#
因此,学习率存储在optim.param_groups[i]['lr']中。optim.param_groups是可以具有不同学习率的不同权重组的列表。因此,简单地执行:
optim.param_groups[i]['lr']
optim.param_groups
for g in optim.param_groups: g['lr'] = 0.001
就可以了。
或者,
正如在评论中提到的,如果你的学习率只取决于纪元号,你可以使用学习率调度器。例如(来自文档的修改示例):
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()
还有,有一个prebuilt learning rate scheduler to reduce on plateaus.
wnavrhmk2#
您可以通过以下方式直接执行此操作,而不是在patapouf_ai's answer中执行循环:
optim.param_groups[0]['lr'] = 0.001
2条答案
按热度按时间2lpgd9681#
因此,学习率存储在
optim.param_groups[i]['lr']
中。optim.param_groups
是可以具有不同学习率的不同权重组的列表。因此,简单地执行:就可以了。
或者,
正如在评论中提到的,如果你的学习率只取决于纪元号,你可以使用学习率调度器。
例如(来自文档的修改示例):
还有,有一个prebuilt learning rate scheduler to reduce on plateaus.
wnavrhmk2#
您可以通过以下方式直接执行此操作,而不是在patapouf_ai's answer中执行循环: