4

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

4

2 回答 2

7

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

W&BWandbCallback无法自动记录您的自定义学习率。通常,对于此类自定义日志记录,如果您使用自定义训练循环,则可以使用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参数。这将确保在同一时间步记录每个指标。更多关于它的信息

打电话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 媒体面板:

在此处输入图像描述

于 2021-08-24T16:42:47.540 回答
0

我想完成ayush-thakur answer。由于调度程序在每个批次/步骤更新学习率,而不是在每个 epoch,记录器应该在 处检索学习率epoch * steps_per_epoch,其中steps_per_epoch是每个 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_endon_epoch_begin.

于 2021-12-09T09:32:55.590 回答