【问题标题】:How to change Learning rate in Tensorflow after a batch end?批处理结束后如何更改 Tensorflow 中的学习率?
【发布时间】:2021-12-13 22:05:05
【问题描述】:

我需要创建一个类来搜索模型的最佳学习率,在每批中将学习率的值增加 %5。我已经看到 on_train_batch_end() 回调,但我无法设置它。

【问题讨论】:

    标签: tensorflow keras deep-learning neural-network callback


    【解决方案1】:

    降低高原学习率仅在一个时期结束时调整学习率。它不会在批次结束时到期。为此,您需要创建一个自定义回调。如果我理解正确,您希望在每批结束时将学习率降低 5%。下面的代码将为您做到这一点。在回调模型中是您编译模型的名称。 freq 是一个整数,用于确定调整学习率的频率。如果 freq=1,它将在每批结束时进行调整。如果 freq=2 它将在每隔一批等上进行调整。 reduction_pct 是一个浮点数。这是学习率将降低的百分比。详细是一个布尔值。如果 verbose=True,每次调整学习率时都会打印输出,显示用于刚刚完成的批次的 LR 和将用于下一个批次的 LR。如果 verbose=False 则不生成打印输出。

    class ADJLR_ON_BATCH(keras.callbacks.Callback):
        def __init__ (self, model, freq, reduction_pct, verbose):
            super(ADJLR_ON_BATCH, self).__init__()
            self.model=model
            self.freq=freq
            self.reduction_pct =reduction_pct
            self.verbose=verbose
            self.adj_batch=freq
            self.factor= 1.0-reduction_pct * .01
        def on_train_batch_end(self, batch, logs=None):
            lr=float(tf.keras.backend.get_value(self.model.optimizer.lr)) # get the current learning rate
            if batch + 1 == self.adj_batch:
                new_lr=lr * self.factor
                tf.keras.backend.set_value(self.model.optimizer.lr, new_lr) # set the learning rate in the optimizer
                self.adj_batch +=self.freq
                if verbose:
                    print('\nat the end of batch ',batch + 1, ' lr was adjusted from ', lr, ' to ', new_lr)
    

    下面是使用回调的示例,我相信您希望使用这些值

    model=your_model_name # variable name of your model
    reduction_pct=5.0 # reduce lr by 5%
    verbose=True  # print out each time the LR is adjusted
    frequency=1   # adjust LR at the end of every batch
    callbacks=[ADJLR_ON_BATCH(model, frequency, reduction_pct, verbose)]
    

    记得在 model.fit 中包含 callbacks=callbacks。下面是结果打印输出的示例,以 .001 的 LR 开头

    at the end of batch  1  lr was adjusted from  0.0010000000474974513  to  0.0009500000451225787
      1/374 [..............................] - ETA: 1:14:55 - loss: 9.3936 - accuracy: 0.3333
    at the end of batch  2  lr was adjusted from  0.0009500000160187483  to  0.0009025000152178108
    
    at the end of batch  3  lr was adjusted from  0.0009025000035762787  to  0.0008573750033974647
      3/374 [..............................] - ETA: 25:04 - loss: 9.1338 - accuracy: 0.4611  
    at the end of batch  4  lr was adjusted from  0.0008573749801144004  to  0.0008145062311086804
    

    【讨论】:

      【解决方案2】:

      查看 tf.keras.callbacks.ReduceLROnPlateau 的源代码。

      https://github.com/keras-team/keras/blob/v2.6.0/keras/callbacks.py#L2581-L2701

      秘密命令是

      tf.keras.backend.set_value(self.model.optimizer.lr)

      你不能赋值,也不能使用 tf.Variable.assign(),因为在 Keras 中,如果构建还没有发生,它可能是成员,或者在构建之后它可能是一个变量。

      【讨论】:

        猜你喜欢
        • 2020-11-27
        • 2016-12-17
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2016-04-28
        相关资源
        最近更新 更多