由于标题是自我描述的,我正在寻找一种方法来重置每次折叠上的
learning rate (lr)
。 ReduceLROnPlateau
的 Keras
回调管理 lr
。
下面是一个可以完成这项工作的自定义回调。训练开始时,回调提示用户输入初始学习率的值。
class INIT_LR(keras.callbacks.Callback):
def __init__ (self, model): # initialization of the callback
super(INIT_LR, self).__init__()
self.model=model
def on_train_begin(self, logs=None): # this runs on the beginning of training
print('Enter initial learning rate below')
lr=input('')
tf.keras.backend.set_value(self.model.optimizer.lr, float(lr)) # set the learning rate in the optimizer
lr=float(tf.keras.backend.get_value(self.model.optimizer.lr)) # get the current learning rate to insure it is set
print('Optimizer learning rate set to ', lr)
在model.fit中设置参数
callbacks = [INIT_LR(model), rlronp]
注意:model是你编译的模型的名称,rlronp是你的ReduceLROnPlateau回调的名称。当你运行 model.fit 你会 提示
Enter initial learning rate below # printed by the callback
.001 # user entered initial learning rate
Optimizer learning rate set to 0.0010000000474974513 # printed by the callback
由于没有可重现的示例,我只能提出建议。如果您查看 ReduceLROnPlateau 的源代码,您可以获得一些灵感并创建自定义回调以在训练开始时重置学习率:
class ResetLR(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
default_lr = 0.1
previous_lr = self.model.optimizer.lr.read_value()
if previous_lr!=defaul_lr:
print("Resetting learning rate from {} to {}".format(previous_lr, default_lr))
self.model.optimizer.lr.assign(default_lr)
因此,通过此回调,您可以使用 for 循环进行训练:
custom_callback = ResetLR()
for fold in folds:
model.fit(...., callbacks=[custom_callback])
如果这不起作用(由于张量流版本),您可以尝试使用
tf.keras.backend
指定默认学习率,如下所示:
class ResetLR(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
default_lr = 0.1
previous_lr = float(tf.keras.backend.get_value(self.model.optimizer.lr))
if previous_lr!=default_lr:
print("Resetting learning rate from {} to {}".format(previous_lr, default_lr))
tf.keras.backend.set_value(self.model.optimizer.lr, default_lr)
我还建议看看这篇post,以获取更多参考。