【问题标题】:Call Keras callback during training epoch more than once在训练时期多次调用 Keras 回调
【发布时间】:2020-08-11 19:27:18
【问题描述】:

我使用 Tensorflow Keras 来训练神经网络。目前我使用以下回调来降低训练过程中的学习率:

def learning_rate_scheduler(lr, epoch):
    return lr * tf.math.exp(-0.1)

我使用回调如下:

callback = tf.keras.callbacks.LearningRateScheduler(learning_rate_scheduler)
model.fit(x_train, y_train, epochs=10, callbacks=[callback], verbose=2)

这按预期工作。然而,使用这种方法,学习率仅在每个 epoch 降低一次。我想知道如何修改此回调,使其在每个时期被称为n 次,而不仅仅是一次?这可能吗?

【问题讨论】:

    标签: python tensorflow keras callback


    【解决方案1】:

    为此,您需要创建一个自定义回调,以便您可以访问与批处理相关的方法。当您从tf.keras.callbacks.Callback 继承时,您可以覆盖on_train_batch_end 并设置每个批次的学习率。如果你想每N 步骤执行一次,那么你可以添加一个counter 属性并在每次调用on_train_batch_end 时递增它。然后,仅在self.counter % N == 0 时设置学习率。一些样板代码可能如下所示。

    class LearningRateSchedule(tf.keras.callbacks.Callback):
        def __init__(self, N):
            super(LearningRateShedule, self).__init__()
            self.N = N
        
        def on_train_begin(self, logs=None):
            self.step = 0
    
        def on_train_batch_end(self, batch, logs=None):
            self.step += 1
            lr = self.get_lr()
            if self.step % self.N == 0:
                # Set learning rate for model
                tf.keras.backend.set_value(self.model.optimizer.lr, lr)
    
        def get_lr(self):
            # Function to get learning rate
            return lr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-10
      • 2020-02-09
      • 2017-06-05
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2019-05-02
      相关资源
      最近更新 更多