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

Man*_*opp 8 python conv-neural-network keras tensorflow learning-rate

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

  1. 可以使用以下方法将时间表包含在回调中tf.keras.callbacks.LearningRateScheduler()
  2. 人们可以使用它将其传递给优化器tf.keras.optimizers.schedules.LearningRateSchedule()

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

有人可以详细说明吗?

Shu*_*hal 5

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

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

tf.keras.callbacks.LearningRateScheduler(schedule, verbose=0)
Run Code Online (Sandbox Code Playgroud)

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__,如文档中所述,

要实现您自己的调度对象,您应该实现 call方法,该方法采用步骤参数(标量整数张量,当前训练步骤计数)。

结论:

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

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

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