监控 InverseTimeDecay() 的学习率 - float() 参数必须是字符串或数字,而不是 'InverseTimeDecay'

Monitor the Learning Rate of the InverseTimeDecay() - float() argument must be a string or a number, not 'InverseTimeDecay'

我的目标是查看 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
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 notebook 并请评论我应该做的任何更改。另外,在评论中写下我可能忘记提及的任何其他信息。

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

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

所以学习率是完全可以从 iterration/steps 预测的,并且没有真正需要使用像 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