【问题标题】:Changing the learning rate after every step in Keras在 Keras 中的每一步之后更改学习率
【发布时间】:2021-08-25 09:48:30
【问题描述】:

我想在一个时期内提高批次之间的学习率,因此网络在一个时期内看到的第一个数据具有低学习率,而它看到的最后一个数据具有高学习率。如何在tf.keras 中执行此操作?

【问题讨论】:

    标签: tensorflow neural-network tf.keras


    【解决方案1】:

    要在每个 epoch 之后修改学习率,您可以使用 tf.keras.callbacks.LearningRateScheduler,如文档 here 中所述。

    但在我们的例子中,我们需要在每批传递给模型后修改学习率。我们将为此使用tf.keras.optimizers.schedules.LearningRateSchedule。这将在每一步或梯度更新后修改学习率。

    假设我的训练数据集中有 100 个样本,批量大小为 5。步数将是 100 / 5 = 20 步。重新定义语句,在单个 epoch 中,20 个批次将传递给模型,梯度更新也将发生 20 次(在单个 epoch 中)。

    使用docs中给出的代码,

    batch_size = 5
    num_train_samples = 100
    
    class MyLRSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
    
      def __init__(self, initial_learning_rate):
        self.initial_learning_rate = initial_learning_rate
    
      def __call__(self, step):
         return self.initial_learning_rate / (step + 1)
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=MyLRSchedule(0.1))
    

    考虑到我们的示例,step 的值将在第一个 epoch 中从 0 变为 19。对于第二个 epoch,它将从 20 变为 39。对于您的用例,我们可以修改上述内容,

    batch_size = 5
    num_train_samples = 100
    num_steps = num_train_samples / batch_size
    
    class MyLRSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
    
      def __init__(self, initial_learning_rate):
        self.initial_learning_rate = initial_learning_rate
    
      def __call__(self, step):
        step_in_epoch = step - (( step // num_steps ) * num_steps )
        # Update LR according to step_in_epoch
         
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=MyLRSchedule(0.1))
    

    step_in_epoch 的值将在第一个 epoch 时从 0 变为 19。对于第二个 epoch,它将再次从 0 变为 19,对于所有 epoch 也是如此。相应地更新 LR。

    确保num_train_samples 可以完全被批量大小整除。这将简化否的计算。步骤。

    【讨论】:

    • 在 for 循环中使用 fit 方法时是否有效?还是我应该使用回调函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2019-09-03
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2019-12-09
    相关资源
    最近更新 更多