我只是想为我的第一个 CNN 设置一个学习率计划,我发现有多种方法可以这样做:
- 可以使用在回调中包含时间表
tf.keras.callbacks.LearningRateScheduler()
- 可以将其传递给优化器使用
tf.keras.optimizers.schedules.LearningRateSchedule()
现在我想知道是否有任何差异,如果有,它们是什么?如果没有区别,那么为什么存在这些替代方案呢?是否有历史原因(以及应该首选哪种方法)?
有人可以详细说明吗?
我只是想为我的第一个 CNN 设置一个学习率计划,我发现有多种方法可以这样做:
tf.keras.callbacks.LearningRateScheduler()
tf.keras.optimizers.schedules.LearningRateSchedule()
现在我想知道是否有任何差异,如果有,它们是什么?如果没有区别,那么为什么存在这些替代方案呢?是否有历史原因(以及应该首选哪种方法)?
有人可以详细说明吗?
两者都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.*
类似PolynomialDecay
或InverseTimeDecay
继承这个类中。因此,该模块提供了 ML 中常用的内置 LR 衰减方法。此外,要实现自定义 LR 衰减,您的类需要继承tf.keras.optimizers.schedules.LearningRateSchedule()
和覆盖方法,如__call__
和 __init__
,如文档中所述,
要实现您自己的调度对象,您应该实现 call方法,该方法接受一个 step 参数(标量整数张量,当前训练步数)。
结论:
如果您想使用一些内置的 LR 衰减,请使用tf.keras.optimizers.schedules.*
模块,即该模块中提供的 LR 衰减。
如果您需要一个简单的自定义 LR 衰减,它只需要 epoch 索引作为参数,请使用tf.keras.callbacks.LearningRateScheduler
.
如果您的自定义 LR Decay 需要的参数不仅仅是 epoch 索引,请创建一个新类并继承tf.keras.optimizers.schedules.LearningRateSchedule
。