Отслеживайте скорость обучения для InverseTimeDecay () - аргумент float () должен быть строкой или числом, а не 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
  • Добавлен также следующий вызов в методе 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

Пожалуйста, проверьте мою записную книжку и прокомментируйте любые изменения, которые я стоит сделать. Также напишите в комментариях любую дополнительную информацию, которую я могу забыть упомянуть.

[UDPATE] - Думаю, моя проблема связана с типом значения optimizer.lr. В моем случае это объект InverseTimeDecay. Как я могу изменить тип этого объекта на число с плавающей запятой? InverseTimeDecay для плавания.


person NikSp    schedule 15.07.2020    source источник


Ответы (1)


InverseTimeDecay и все LearningRateSchedule экземпляры - это функции, которые принимают шаг и возвращают скорость обучения.

Таким образом, скорость обучения полностью предсказуема на основе итераций / шагов, и нет реальной необходимости отслеживать ее с помощью чего-то вроде тензорной доски, но если вы действительно хотите, вы можете использовать что-то вроде следующего:

def get_lr_metric(optimizer):
    lr = optimizer.learning_rate
    if isinstance(lr, tf.keras.optimizers.schedules.LearningRateSchedule):
        return lr(optimizer.iterations)
    else: 
        return lr
person Amit Portnoy    schedule 12.10.2020
comment
Большое спасибо за ответ, Амит. Работает как положено :) - person NikSp; 14.10.2020