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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tensorflow 2.0的自定义训练循环的学习率相关的知识,希望对你有一定的参考价值。

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

这里是张量流指南的一个示例:

def train_step(images, labels):
  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))

  train_loss(loss)
  train_accuracy(labels, predictions)

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

我将非常感谢您能提供的任何帮助。 :)

答案

在自定义训练循环设置中,您可以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_lrAdam/dense/kernel,可以像这样访问mv

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())

然后您可以使用上述公式轻松计算act_lr

以上是关于Tensorflow 2.0的自定义训练循环的学习率的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 2 中用于自定义训练循环的 Tensorboard

如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?

自定义训练循环中记录tf.variable

tensorflow 测量工具,与自定义训练

具有自定义训练循环的 Tensorboard Graph 不包括我的模型

使用 TensorFlow 2.0 Alpha 时无法在 Tensorboard 中看到 keras 模型图