有没有办法在使用Keras的ReduceLROnPlateau回调时重置每次折叠的学习率?

问题描述 投票:0回答:2

由于标题是自我描述的,我正在寻找一种方法来重置每次折叠上的

learning rate (lr)
ReduceLROnPlateau
Keras
回调管理
lr

python tensorflow keras deep-learning tensorflow2.0
2个回答
2
投票

下面是一个可以完成这项工作的自定义回调。训练开始时,回调提示用户输入初始学习率的值。

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

1
投票

由于没有可重现的示例,我只能提出建议。如果您查看 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,以获取更多参考。

© www.soinside.com 2019 - 2024. All rights reserved.