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_lr
由base_lr
,m
和v
决定。 m
和v
是参数的第一和第二动量。不同的参数具有不同的m
和v
值。因此,如果您想知道act_lr
,则需要知道变量的名称。例如,您想知道变量act_lr
的Adam/dense/kernel
,可以像这样访问m
和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())
然后您可以使用上述公式轻松计算act_lr
。
以上是关于Tensorflow 2.0的自定义训练循环的学习率的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow 2 中用于自定义训练循环的 Tensorboard
如何在 TF 2.0 / 1.14.0-eager 和自定义训练循环(梯度磁带)中执行梯度累积?