PyTorch - 如何在训练过程中获得学习率?

问题描述 投票:0回答:5

在训练时,我想知道learning_rate的值。 我该怎么办?

这是我的代码,像这样:

my_optimizer = torch.optim.SGD(my_model.parameters(), 
                               lr=0.001, 
                               momentum=0.99, 
                               weight_decay=2e-3)

谢谢你。

python machine-learning deep-learning pytorch
5个回答
44
投票

对于像您给出的示例中那样只有一个参数组,您可以使用此函数并在训练期间调用它来获取当前的学习率:

def get_lr(optimizer):
    for param_group in optimizer.param_groups:
        return param_group['lr']

11
投票

或者,您可以将

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


3
投票

从 PyTorch 1.13.0 开始,可以通过方法

scheduler.get_last_lr()
访问学习率列表 - 或者直接
scheduler.get_last_lr()[0]
(如果您只使用单一学习率)。

可以在调度程序的基类中找到该方法

LRScheduler
查看他们的代码)。正如 Zahra 所提到的,它实际上返回基类中的属性
scheduler._last_lr
,但调用该方法应该是更好的选择。

编辑:感谢@igorkf 的回复


3
投票

使用

optimizer.param_groups[-1]['lr']

0
投票

当我阅读 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']
© www.soinside.com 2019 - 2024. All rights reserved.