在训练期间多次呼叫Keras回调

问题描述

我使用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)

这按预期工作。然而,采用这种方法,每个周期仅降低一次学习率。我想知道如何修改此回调,以便每个时期调用n次,而不仅仅是一次?有可能吗?

解决方法

为此,您将需要创建一个自定义回调,以便可以访问与批处理相关的方法。从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