问题描述
我使用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