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



我只是想为我的第一个CNN设置一个学习率时间表,我发现有多种方法可以做到这一点:

  1. 可以使用tf.keras.callbacks.LearningRateScheduler()在回调中包含时间表
  2. 可以使用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.*中包括的其他类型的衰变,如PolynomialDecayInverseTimeDecay,继承了此类。因此,该模块提供了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

相关内容

  • 没有找到相关文章

最新更新