我想定制我自己的优化器,该优化器将在每一个keras批次结束时更改学习率。首先,我构建一个自定义回调:
class custom_callback(Callback):
def __init__(self,lr):
super(op_callback, self).__init__()
self.lr=lr
def on_batch_end(self,batch,logs={}):
sgd = SGD(lr=batch*self.lr)
self.model.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=['accuracy'])
然后,我从doc复制SGD优化器代码。因为我想确保学习率已更改,所以我在get_update
函数中打印了学习率。
def get_updates(self, loss, params):
print(self.lr)
...
但是它仅打印一次学习率。我发现get_update
函数只会在构建计算图的开始时被调用。但是我仍然不明白为什么即使我重新初始化SGD实例也不能打印任何内容。如何在优化程序的批处理结束时更改参数?预先感谢。
答案 0 :(得分:0)
看一下LearningRateScheduler
的源代码,看来是实现以下目标的一种最小方法(它没有检查get_update
的调用频率,我什至不确定它是否被调用应该在每个批次上执行,无论如何,此回调肯定会调整学习率):
from keras import backend as K
from keras.callbacks import Callback
class BatchLearningRateScheduler(Callback):
def __init__(self, lr):
super().__init__()
self.lr = lr
def on_batch_end(self, batch, logs=None):
lr = batch * self.lr
K.set_value(self.model.optimizer.lr, lr)