我只是想为我的第一个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:一个函数,以epoch索引(整数,从0开始索引(和当前学习率(float(作为输入,并返回新的学习率作为输出。
schedule
函数将返回给定当前历元索引的学习率。要实现各种类型的LR衰变,如指数衰变、多项式衰变等,您需要在schedule
方法中自行编码。
另一方面,tf.keras.optimizers.schedules.LearningRateSchedule()
是一个高级类。tf.keras.optimizers.schedules.*
中包括的其他类型的衰变,如PolynomialDecay
或InverseTimeDecay
,继承了此类。因此,该模块提供了ML中常用的内置LR衰减方法。此外,要实现自定义LR衰减,您的类需要继承tf.keras.optimizers.schedules.LearningRateSchedule()
并覆盖__call__
和__init__
等方法,如文档中所述,
要实现自己的调度对象,您应该实现调用方法,该方法采用步参数(标量整数张量,当前训练步数(。
结论:
如果您想使用一些内置的LR衰变,请使用
tf.keras.optimizers.schedules.*
模块,即该模块中提供的LR衰变。如果您需要一个只需要epoch索引作为参数的简单自定义LR衰减,请使用
tf.keras.callbacks.LearningRateScheduler
。如果您的自定义LR Decay需要比epoch索引更多的参数,请创建一个新类并继承
tf.keras.optimizers.schedules.LearningRateSchedule
。