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

https://stackoverflow.com/questions/68903269
复制相似问题