在训练时,我想知道learning_rate的值。 我该怎么办?
这是我的代码,像这样:
my_optimizer = torch.optim.SGD(my_model.parameters(),
lr=0.001,
momentum=0.99,
weight_decay=2e-3)
谢谢你。
对于像您给出的示例中那样只有一个参数组,您可以使用此函数并在训练期间调用它来获取当前的学习率:
def get_lr(optimizer):
for param_group in optimizer.param_groups:
return param_group['lr']
或者,您可以将
lr_scheduler
与优化器一起使用,并简单地调用内置 lr_scheduler.get_lr()
方法。
这是一个例子:
my_optimizer = torch.optim.Adam( my_model.parameters(),
lr = 0.001,
weight_decay = 0.002)
my_lr_scheduler = torch.optim.lr_scheduler.StepLR( my_optimizer,
step_size = 50,
gamma = 0.1)
# train
...
my_optimizer.step()
my_lr_scheduler.step()
# get learning rate
my_lr = my_lr_scheduler.get_lr()
# or
my_lr = my_lr_scheduler.optimizer.param_groups[0]['lr']
使用
lr_scheduler
的额外好处是可以更好地控制随时间变化的 lr; lr_decay 等
对于 lr_scheduler args,请参阅 pytorch docs。
从 PyTorch 1.13.0 开始,可以通过方法
scheduler.get_last_lr()
访问学习率列表 - 或者直接 scheduler.get_last_lr()[0]
(如果您只使用单一学习率)。
可以在调度程序的基类中找到该方法
LRScheduler
(查看他们的代码)。正如 Zahra 所提到的,它实际上返回基类中的属性 scheduler._last_lr
,但调用该方法应该是更好的选择。
编辑:感谢@igorkf 的回复
使用
optimizer.param_groups[-1]['lr']
当我阅读 torch.optim.Optimizer 及其子类之一(例如 torch.optim.Adam)的源代码时,我很清楚
lr
存储在名为 defaults
的字典中在子类中,然后将此字典与 __init__
一起传递到基类(即 Optimizer
类)的 params
方法中。收到参数后,基类会将 defaults
保存到其自己的同名属性中。这是其源代码的一小部分:
def __init__(self, params, defaults):
torch._C._log_api_usage_once("python.optimizer")
self.defaults = defaults
...
因此,要从 torch 的优化器中检索学习率的值,我相信解决方案是:
optimizer.defaults['lr']