pyras中Keras学习率下降

时间:2019-04-13 08:09:27

标签: python keras conv-neural-network pytorch

我有一个关于Keras学习率下降的问题。我需要了解选项衰减在优化器中的工作原理,以便将其转换为等效的PyTorch公式。

从SGD的源代码中,我看到每次批量更新后都以这种方式完成了更新:

lr = self.lr * (1. / (1. + self.decay * self.iterations))

这是否意味着在每次批量更新后,lr会从其先前更新的值或其初始值开始更新?我的意思是,以下两种解释中哪一种是正确的?

lr = lr_0 * (1. / (1. + self.decay * self.iterations))

lr = lr * (1. / (1. + self.decay * self.iterations))

其中lr是先前迭代之后更新的lr,而lr_0始终是初始学习率。

如果正确的答案是第一个,那么就我而言,这意味着学习率将在100个纪元后从0.001下降到0.0002,而在第二个情况中,学习率将在1e-230左右从0.001下降。在70个时代之后。

为给您提供一些背景信息,我正在与CNN合作解决图像回归问题,我只需要将Keras代码转换为Pytorch代码即可。到目前为止,使用上述第二种解释,无论批次大小和测试时间的输入如何,我都只能总是预测相同的值。

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

基于Keras中的实现,我认为您的第一个表述是正确的,即包含初始学习率的表述(请注意,self.lr不会被更新)。

但是我认为您的计算可能不正确:因为分母是相同的,并且lr_0> = lr因为您在进行衰减,因此第一个公式必须得出更大的数字。

我不确定PyTorch是否可以使用这种衰减,但是您可以使用torch.optim.lr_scheduler.LambdaLR轻松创建类似的东西。

decay = .001
fcn = lambda step: 1./(1. + decay*step)
scheduler = LambdaLR(optimizer, lr_lambda=fcn)

最后,不要忘记您将需要在调度程序上显式调用.step(),单步执行优化程序是不够的。另外,大多数情况下,学习计划仅在一个完整的时期之后才完成,而不是在每个批次之后才进行,但是我看到您在这里只是在重新创建Keras行为。

答案 1 :(得分:0)

实际上,mkisantal的响应可能是不正确的,因为关于keras中学习率的实际方程式(至少是这样,现在没有默认的衰减选项)是这样的:

lr = lr * (1. / (1. + self.decay * self.iterations))

(请参见https://github.com/keras-team/keras/blob/2.2.0/keras/optimizers.py#L178

并且mkisantal提出的解决方案缺少重复/乘法项lr,因此更准确的版本应基于MultiplicativeLR

decay = .001
fcn = lambda step: 1./(1. + decay*step)
scheduler = MultiplicativeLR(optimizer, lr_lambda=fcn)