我正在训练一个 keras 模型并为优化器使用自定义学习率调度程序(类型为 tf.keras.optimizers.schedules.LearningRateSchedule),我想通过权重和偏差框架记录学习率变化。我找不到如何将它传递给 WandbCallback 对象或以任何方式记录它
2 回答
您可以使用自定义 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 媒体面板:
我想完成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_end
为on_epoch_begin
.