【问题标题】:logging learning rate schedule in keras via weights and biases通过权重和偏差记录 keras 中的学习率计划
【发布时间】:2021-08-24 07:17:26
【问题描述】:

我正在训练一个 keras 模型并为优化器使用自定义学习率调度程序(类型为 tf.keras.optimizers.schedules.LearningRateSchedule),我想通过权重和偏差框架记录学习率变化。 我找不到如何将它传递给 WandbCallback 对象或以任何方式记录它

【问题讨论】:

  • 嘿,我来自 W&B 团队。可以分享一下你的 LR 调度器吗?

标签: python tensorflow keras deep-learning wandb


【解决方案1】:

您可以使用自定义 Keras 回调将自定义学习率记录到权重和偏差上。

W&B 的 WandbCallback 无法自动记录您的自定义学习率。通常,对于此类自定义日志记录,如果您使用自定义训练循环,您可以使用wandb.log()。如果你使用model.fit()自定义Keras回调方法。

例如:

这是我基于tf.keras.optimizers.schedules.LearningRateSchedule 的调度程序。

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.001))

您可以使用optimizer.learning_rate(step) 获取优化器的当前学习率。这可以包装为自定义 Keras 回调并使用 wandb.log()。

class LRLogger(tf.keras.callbacks.Callback):
    def __init__(self, optimizer):
      super(LRLogger, self).__init__()
      self.optimizer = optimizer

    def on_epoch_end(self, epoch, logs):
      lr = self.optimizer.learning_rate(epoch)
      wandb.log({"lr": lr}, commit=False)

请注意,在wandb.log 调用中,我使用了commit=False 参数。这将确保在同一时间步记录每个指标。更多信息here.

致电model.fit()。

tf.keras.backend.clear_session()
model = some_model()

model.compile(optimizer, 'categorical_crossentropy', metrics=['acc'])

wandb.init(entity='wandb-user-id', project='my-project', job_type='train')

_ = model.fit(trainloader,
          epochs=EPOCHS,
          validation_data=testloader,
          callbacks=[WandbCallback(), # using WandbCallback to log default metrics.
                     LRLogger(optimizer)]) # using callback to log learning rate.

wandb.finish()

这是 W&B 媒体面板:

【讨论】:

    【解决方案2】:

    我想填写ayush-thakur answer。由于调度程序在每个批次/步骤更新学习率,而不是在每个时期,记录器应该在epoch * steps_per_epoch 检索学习率,其中steps_per_epoch 是每个时期的批次数。该值存储在optimizer.iterations。

    拿起@ayush-thakur 代码示例并更改on_epoch_end 函数:

    class LRLogger(tf.keras.callbacks.Callback):
        def __init__(self, optimizer):
          super(LRLogger, self).__init__()
          self.optimizer = optimizer
    
        def on_epoch_end(self, epoch, logs):
          lr = self.optimizer.learning_rate(self.optimizer.iterations)
          wandb.log({"lr": lr}, commit=False)
    

    然后您可以在model.fit 训练过程中使用此回调。

    请注意,上面的代码将返回每个 epoch 的最后一批的学习率。要获取每个epoch的第一批的学习率,请将on_epoch_end替换为on_epoch_begin。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2018-05-28
      相关资源
      最近更新 更多