0

我的目标是查看 Adam 优化器的学习率进程,我在该进程上应用了 InverseTimeDecay 计划。所以我想检查学习率是否真的降低了。

在检查了堆栈溢出的这个问题后,我在我的代码中做了类似的更改:

  • 在我的回调函数中添加了这个,
tf.keras.callbacks.LearningRateScheduler(hparams[HP_LEARNING_RATE])
  • 根据发布的类似问题添加了此函数调用:
def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr
    return lr
  • 在 model.compile 方法中还添加了以下调用,
lr_metric = [get_lr_metric(optimizer)]

    model.compile(optimizer=optimizer,
                  loss=neural_network_parameters['model_loss'],
                  metrics=neural_network_parameters['model_metric'] + lr_metric, ) #+ lr_metric

但是,当我开始训练模型时,出现以下错误:

TypeError: float() argument must be a string or a number, not 'InverseTimeDecay'

TypeError: 'float' object is not callable

请检查我的colab 笔记本,并请评论我应该做的任何更改。另外,请在评论中写下我可能忘记提及的任何其他信息。

[UDPATE] - 我想我的问题是 optimizer.lr 值的类型。在我的例子中是一个 InverseTimeDecay 对象。如何将该对象的类型更改为浮点数?InverseTimeDecay 浮动。

4

1 回答 1

2

InverseTimeDecay每个LearningRateSchedule实例都是接受一个步骤并返回学习率的函数。

因此,学习率完全可以从迭代/步骤中预测,并且没有真正需要使用 tensorboard 之类的东西来监控它,如果你真的想要,你可以使用类似以下的东西:

def get_lr_metric(optimizer):
    lr = optimizer.learning_rate
    if isinstance(lr, tf.keras.optimizers.schedules.LearningRateSchedule):
        return lr(optimizer.iterations)
    else: 
        return lr
于 2020-10-12T11:11:26.360 回答