在 Keras 的每一步后改变学习率

Changing the learning rate after every step in Keras

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

要在每个 epoch 之后修改学习率,您可以使用文档 here 中提到的 tf.keras.callbacks.LearningRateScheduler

但在我们的例子中,我们需要在每个批次传递给模型后修改学习率。我们将使用 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 的值将从 0 变为 19。对于第二个纪元,它将从 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 的值将从 0 变为 19。对于第二个纪元,它将再次从 0 变为 19,所有纪元也是如此。相应地更新 LR。

Make sure that num_train_samples is perfectly divisible by the batch size. This would ease the calculation of no. of steps.