首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修正调度程序的“恢复优化器时未指定的initial_lr”错误?

如何修正调度程序的“恢复优化器时未指定的initial_lr”错误?
EN

Stack Overflow用户
提问于 2022-04-29 13:15:46
回答 3查看 1.1K关注 0票数 0

在PyTorch中,我配置了这样的SGD:

代码语言:javascript
运行
复制
sgd_config = {
    'params' : net.parameters(),
    'lr' : 1e-7,
    'weight_decay' : 5e-4,
    'momentum' : 0.9
}
optimizer = SGD(**sgd_config)

我的要求是:

  • 总年数为100。
  • 每30个时代的学习率会降低10倍。
  • 学习率的下降将在60年代停止。

因此,在100个时代,我将得到两倍的0.1降低我的学习率。

我读过关于学习速率调度器的文章,它在torch.optim.lr_scheduler中可用,所以我决定尝试使用它,而不是手动调整学习速度:

代码语言:javascript
运行
复制
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, last_epoch=60, gamma=0.1)

不管我得到了什么

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "D:\Projects\network\network_full.py", line 370, in <module>
    scheduler = lr_scheduler.StepLR(optimizer, step_size=30, last_epoch=90, gamma=0.1)
  File "D:\env\test\lib\site-packages\torch\optim\lr_scheduler.py", line 367, in __init__
    super(StepLR, self).__init__(optimizer, last_epoch, verbose)
  File "D:\env\test\lib\site-packages\torch\optim\lr_scheduler.py", line 39, in __init__
    raise KeyError("param 'initial_lr' is not specified "
KeyError: "param 'initial_lr' is not specified in param_groups[0] when resuming an optimizer"

我读了一篇文章这里,我仍然不知道如何在我的场景中使用调度器。也许我只是不理解last_epoch的定义,因为文档对这个参数非常简短:

last_epoch (int) -上个时代的指数。默认值:-1

由于该参数可供用户使用,而且没有明确禁止使用调度程序的时间少于优化器本身,因此我开始认为这是一个bug。

EN

回答 3

Stack Overflow用户

发布于 2022-04-30 12:58:39

您误解了last_epoch参数,并且没有为您的需求使用正确的学习速率调度程序。

这应该是可行的:

代码语言:javascript
运行
复制
optim.lr_scheduler.MultiStepLR(optimizer, [0, 30, 60], gamma=0.1, last_epoch=args.current_epoch - 1)

last_epoch参数确保在恢复培训时使用正确的LR。它的默认值是-1,所以在0之前的时代。

票数 1
EN

Stack Overflow用户

发布于 2022-09-10 22:01:26

答:您必须以diff格式将last_epoch=60指定为单独的命令:

代码语言:javascript
运行
复制
<< scheduler = lr_scheduler.StepLR(optimizer, step_size=30, last_epoch=60, gamma=0.1)
代码语言:javascript
运行
复制
>> scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
>> scheduler.last_epoch = 60

使用此方法检查调度程序值:

代码语言:javascript
运行
复制
print(scheduler.state_dict())

{'step_size':30,'gamma':0.1,'base_lrs':0.0002,‘最后一个_纪元’:4,'_step_count':5,‘详细’:False,'_get_lr_called_within_step':False,'_last_lr':0.0002}

票数 0
EN

Stack Overflow用户

发布于 2022-10-01 13:48:09

代码语言:javascript
运行
复制
 sgd_config = {
    'params' : net.parameters(),
    **'initial_lr': 1e-7**,
    'lr' : 1e-7,
    'weight_decay' : 5e-4,
    'momentum' : 0.9
}
optimizer = SGD(**sgd_config)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72058575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档