如何解决在训练期间多次呼叫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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。