如何在培训循环(以及优化器/调度器交互)中使用Pytorch OneCycleLR?

如何在培训循环(以及优化器/调度器交互)中使用Pytorch OneCycleLR?,pytorch,Pytorch,我正在训练一个NN,使用RMSprop作为优化器,使用OneCycleLR作为调度器。我一直这样运行它(代码稍微简化): 注意每个小批量中的优化器和调度程序调用。这是可行的,尽管当我通过训练绘制学习率时,曲线非常不平坦。我再次检查了文档,这是为torch.optim.lr\u scheduler.OneCycleLR >>> data_loader = torch.utils.data.DataLoader(...) >>> optimizer = torch

我正在训练一个NN,使用RMSprop作为优化器,使用OneCycleLR作为调度器。我一直这样运行它(代码稍微简化):

注意每个小批量中的优化器和调度程序调用。这是可行的,尽管当我通过训练绘制学习率时,曲线非常不平坦。我再次检查了文档,这是为
torch.optim.lr\u scheduler.OneCycleLR

>>> data_loader = torch.utils.data.DataLoader(...)
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(data_loader), epochs=10)
>>> for epoch in range(10):
>>>     for batch in data_loader:
>>>         train_batch(...)
>>>         scheduler.step()
在这里,它们省略了训练循环中的
优化器.step()
。我认为,这是有意义的,因为优化器是在初始化时提供给OneCycleLR的,所以它必须在后端处理这个问题。但这样做给了我一个警告:

UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`.
我是否忽略了这一点,信任文档中的伪代码?是的,我做了,模型没有做任何学习,所以警告是正确的,我把
optimizer.step()
放回

这使得我无法真正理解优化器和调度器是如何交互的(编辑:优化器中的学习率如何与调度器中的学习率交互)。我看到,通常情况下,优化器在每个小批量运行,调度器在每个历元运行,不过对于OneCycleLR,他们希望您也在每个小批量运行它

任何指导(或一篇好的教程文章)都将不胜感激

在调度程序.step()之前使用
optimizer.step()
。另外,对于
OneCycleLR
,您需要在每个步骤之后运行
scheduler.step()
。因此,您的培训代码是正确的(就在优化器和调度器上调用
step()


另外,在您提到的示例中,他们已经通过了
步骤/epoch
参数,但您在培训代码中没有这样做。文件中也提到了这一点。这可能是导致代码出现问题的原因。

谢谢您的回复。实际上,我确实使用了
步骤/epoch=len(火车装载机)
,但在我的代码示例中忽略了这一点。
UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`.