在PyTorch中,我配置了这样的SGD:
sgd_config = {
'params' : net.parameters(),
'lr' : 1e-7,
'weight_decay' : 5e-4,
'momentum' : 0.9
}
optimizer = SGD(**sgd_config)
我的要求是:
因此,在100个时代,我将得到两倍的0.1
降低我的学习率。
我读过关于学习速率调度器的文章,它在torch.optim.lr_scheduler
中可用,所以我决定尝试使用它,而不是手动调整学习速度:
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, last_epoch=60, gamma=0.1)
不管我得到了什么
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。
发布于 2022-04-30 12:58:39
您误解了last_epoch参数,并且没有为您的需求使用正确的学习速率调度程序。
这应该是可行的:
optim.lr_scheduler.MultiStepLR(optimizer, [0, 30, 60], gamma=0.1, last_epoch=args.current_epoch - 1)
last_epoch参数确保在恢复培训时使用正确的LR。它的默认值是-1,所以在0之前的时代。
发布于 2022-09-10 22:01:26
答:您必须以diff格式将last_epoch=60指定为单独的命令:
<< scheduler = lr_scheduler.StepLR(optimizer, step_size=30, last_epoch=60, gamma=0.1)
>> scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
>> scheduler.last_epoch = 60
使用此方法检查调度程序值:
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}
发布于 2022-10-01 13:48:09
sgd_config = {
'params' : net.parameters(),
**'initial_lr': 1e-7**,
'lr' : 1e-7,
'weight_decay' : 5e-4,
'momentum' : 0.9
}
optimizer = SGD(**sgd_config)
https://stackoverflow.com/questions/72058575
复制相似问题