当我使用tensorflow 2.0自定义训练循环时,是否有任何功能或方法可以显示学习率?
以下是张量流指南的示例:
_chewieController.videoPlayerController.initialized
在训练模型时如何从优化器中检索当前学习率?
如果您能提供任何帮助,我将不胜感激。 :)
答案 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_lr
由base_lr
,m
和v
决定。 m
和v
是参数的第一和第二动量。不同的参数具有不同的m
和v
值。因此,如果您想知道act_lr
,则需要知道变量的名称。例如,您想知道变量act_lr
的{{1}},可以像这样访问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())
。