tf.Keras 学习率计划——传递给优化器还是回调?

时间:2021-05-28 11:25:47

标签: python tensorflow keras conv-neural-network learning-rate

我只是想为我的第一个 CNN 设置学习率计划,我发现有多种方法可以这样做:

  1. One can include the schedule in callbacks 使用 tf.keras.callbacks.LearningRateScheduler()
  2. One can pass it to an optimizer 使用 tf.keras.optimizers.schedules.LearningRateSchedule()

现在我想知道是否有任何差异,如果有,它们是什么?如果没有区别,那么为什么会存在这些替代方案?是否有历史原因(应该首选哪种方法)?

谁能详细说明一下?

1 个答案:

答案 0 :(得分:2)

tf.keras.callbacks.LearningRateScheduler()tf.keras.optimizers.schedules.LearningRateSchedule() 都提供相同的功能,即在训练模型时实现学习率衰减。

一个明显的区别可能是 tf.keras.callbacks.LearningRateScheduler 在其构造函数中接受一个函数,如文档中所述,

tf.keras.callbacks.LearningRateScheduler(schedule, verbose=0)
<块引用>

schedule:一个函数,它以纪元索引(整数,从 0 开始索引)和当前学习率(浮点数)作为输入,并返回一个新的学习率作为输出(浮点数)。

schedule 函数将返回给定当前纪元索引的学习率。要实现各种类型的 LR 衰减,例如指数衰减、多项式衰减等,您需要自己在此 schedule 方法中对它们进行编码。

另一方面,tf.keras.optimizers.schedules.LearningRateSchedule() 是一个高级类。 tf.keras.optimizers.schedules.* 中包含的其他类型的衰减,如 PolynomialDecayInverseTimeDecay 继承了此类。因此,该模块提供了 ML 中常用的内置 LR 衰减方法。此外,要实现自定义 LR 衰减,您的类需要继承 tf.keras.optimizers.schedules.LearningRateSchedule() 并覆盖 __call____init__ 等方法,如文档中所述,

<块引用>

要实现您自己的计划对象,您应该实现 调用方法,它接受一个步长参数(标量整数张量,当前训练步数)。

结论:

  • 如果您想使用某些内置的 LR Decay,请使用 tf.keras.optimizers.schedules.* 模块,即该模块中提供的 LR 衰减。

  • 如果您需要一个简单的自定义 LR 衰减,它只需要纪元索引作为参数,请使用 tf.keras.callbacks.LearningRateScheduler

  • 如果您的自定义 LR Decay 需要更多参数而不仅仅是纪元索引,请创建一个新类并继承 tf.keras.optimizers.schedules.LearningRateSchedule