tensorflow 2.0的自定义训练循环的学习率

时间:2019-09-28 19:55:58

标签: python tensorflow

当我使用tensorflow 2.0自定义训练循环时,是否有任何功能或方法可以显示学习率?

以下是张量流指南的示例:

_chewieController.videoPlayerController.initialized

在训练模型时如何从优化器中检索当前学习率?

如果您能提供任何帮助,我将不胜感激。 :)

2 个答案:

答案 0 :(得分:6)

在Tensorflow 2.1中,Optimizer类具有未公开的方法_decayed_lr(请参见定义here),您可以在训练循环中通过提供要转换为的变量类型来调用该方法:

current_learning_rate = optimizer._decayed_lr(tf.float32)

这也是TensorBoard的更完整示例。

train_step_count = 0
summary_writer = tf.summary.create_file_writer('logs/')
def train_step(images, labels):
  train_step_count += 1
  with tf.GradientTape() as tape:
    predictions = model(images)
    loss = loss_object(labels, predictions)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

  # optimizer._decayed_lr(tf.float32) is the current Learning Rate.
  # You can save it to TensorBoard like so:
  with summary_writer.as_default():
    tf.summary.scalar('learning_rate',
                      optimizer._decayed_lr(tf.float32),
                      step=train_step_count)

答案 1 :(得分:1)

在自定义训练循环设置中,您可以print(optimizer.lr.numpy())获取学习率。

如果使用的是keras api,则可以定义自己的回调来记录当前学习率。

from tensorflow.keras.callbacks import Callback

class LRRecorder(Callback):
    """Record current learning rate. """
    def on_epoch_begin(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        print("The current learning rate is {}".format(lr.numpy()))

# your other callbacks 
callbacks.append(LRRecorder())

更新

w := w - (base_lr*m/sqrt(v))*grad = w - act_lr*grad 我们获得的学习率是base_lr。但是,act_lr在训练过程中是自适应更改的。以Adam优化器为例,act_lrbase_lrmv决定。 mv是参数的第一和第二动量。不同的参数具有不同的mv值。因此,如果您想知道act_lr,则需要知道变量的名称。例如,您想知道变量act_lr的{​​{1}},可以像这样访问Adam/dense/kernelm

v

然后,您可以使用上述公式轻松计算for var in optimizer.variables(): if 'Adam/dense/kernel/m' in var.name: print(var.name, var.numpy()) if 'Adam/dense/kernel/v' in var.name: print(var.name, var.numpy())