Keras:如何将学习率输出到张量板上

时间:2018-03-06 09:16:36

标签: keras tensorboard

我添加了一个回调来降低学习率:

 keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=100, 
                                   verbose=0, mode='auto',epsilon=0.00002, cooldown=20, min_lr=0)

这是我的张量回调:

keras.callbacks.TensorBoard(log_dir='./graph/rank{}'.format(hvd.rank()), histogram_freq=10, batch_size=FLAGS.batch_size,
                            write_graph=True, write_grads=True, write_images=False)

我想确保它在我的训练中被踢了,所以我想把学习率输出到tensorbaord。但是我找不到我可以设置它的位置。

我还检查了优化器api,但没有运气。

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

那么如何将学习率输出到tensorboad?

4 个答案:

答案 0 :(得分:14)

According to the author of Keras正确的方式是对TensorBoard回调进行子类化:

from keras import backend as K
from keras.callbacks import TensorBoard

class LRTensorBoard(TensorBoard):
    def __init__(self, log_dir):  # add other arguments to __init__ if you need
        super().__init__(log_dir=log_dir)

    def on_epoch_end(self, epoch, logs=None):
        logs.update({'lr': K.eval(self.model.optimizer.lr)})
        super().on_epoch_end(epoch, logs)

答案 1 :(得分:2)

请注意,在当前夜间版本的tf(2.5-可能更早)的情况下,使用LearningRateSchedule的学习率会自动添加到张量板的日志中。仅当您以其他方式调整学习率时,才需要以下解决方案-例如通过ReduceLROnPlateauLearningRateScheduler(不同于LearningRateSchedule)回调。

虽然扩展tf.keras.callbacks.TensorBoard是可行的选择,但我更喜欢使用组合而不是子类化。

class LearningRateLogger(tf.keras.callbacks.Callback):
    def __init__(self):
        super().__init__()
        self._supports_tf_logs = True

    def on_epoch_end(self, epoch, logs=None):
        if logs is None or "learning_rate" in logs:
            return
        logs["learning_rate"] = self.model.optimizer.lr

这允许我们编写多个类似的回调,并在其他多个回调中使用记录的学习率(例如,如果添加CSVLogger,它也应该将学习率值写入文件)。

然后在model.fit

model.fit(
    callbacks=[
        LearningRateLogger(),
        # other callbacks that update `logs`
        tf.keras.callbacks.TensorBoard(path),
        # other callbacks that use updated logs, e.g. CSVLogger
    ],
    **kwargs
)

答案 2 :(得分:0)

你给了优化器的代码两次,而不是TensorBoard Callback。无论如何,我没有找到在TensorBoard上显示学习率的方法。 我在训练结束后绘制它,从历史对象中获取数据:

string note = PXNoteAttribute.GetNote(Base.Item.Cache, Base.Item.Current);

图表如下所示: LR plot

很抱歉,这不是你要问的问题,但也许可以提供帮助。

答案 3 :(得分:0)

class XTensorBoard(TensorBoard):
    def on_epoch_begin(self, epoch, logs=None):
        # get values
        lr = float(K.get_value(self.model.optimizer.lr))
        decay = float(K.get_value(self.model.optimizer.decay))
        # computer lr
        lr = lr * (1. / (1 + decay * epoch))
        K.set_value(self.model.optimizer.lr, lr)

    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        logs['lr'] = K.get_value(self.model.optimizer.lr)
        super().on_epoch_end(epoch, logs)

callbacks_list = [XTensorBoard('./logs')]
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=32, verbose=2, callbacks=callbacks_list)

lr curve in tensorboard