Как я могу написать собственный показатель c только для потерь регуляризации? - PullRequest
1 голос
/ 25 апреля 2020

Некоторые слои имеют потери регуляризации. Я хотел бы иметь «metri c», который только отслеживает потери регуляризации, чтобы я мог отдельно (от общей потери) видеть в индикаторе прогресса, как потери регуляризации развиваются во время обучения. Кроме того, учитывая, что метрики сохраняются в объекте истории (возвращаемом fit), я мог бы легко построить и сохранить (в файл) потери регуляризации в конце обучения.

Как мне написать пользовательский метри c только для потерь регуляризации?

Я знаю, что у меня может быть обратный вызов, который повторяет слои модели и суммирует потери регуляризации (см., например, { ссылка }) , но я хотел бы иметь metri c (а не обратный вызов), потому что metri c будет сохранен в объекте истории.

В конечном счете, я хотел бы, чтобы потери регуляризации присутствовали в историческом объекте и отображались в индикаторе выполнения (отдельно от общих потерь), даже без реализации пользовательского показателя c, но я не делаю знать, есть ли такая опция в tf.keras. Также было бы неплохо, если бы у меня было два варианта: 1. увидеть сумму всех потерь регуляризации во всех слоях и 2. увидеть потери регуляризации для каждого слоя отдельно.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Я думаю, что нашел решение. Вы можете изменить параметр logs в обратном вызове, чтобы добавить необходимую информацию. Тогда ваш исторический объект будет автоматически содержать эту новую информацию.

def get_cb(model):
    def on_epoch_end(epoch, logs):
        # Iterate the layers of your model to get the regularisation losses
        reg_losses = get_your_regularisation_losses(model)
        logs["reg_losses"] = reg_losses

    return tf.keras.callbacks.LambdaCallback(on_epoch_end=on_epoch_end)

...
history = model.fit(..., callbacks=[get_cb(model)])
do_something(history) # history contains "reg_losses"

(Не стесняйтесь предлагать альтернативные решения, использующие пользовательские метрики!)

0 голосов
/ 06 мая 2020

Чтобы получить его в индикаторе выполнения, вы можете сделать что-то вроде этого :

def get_reg_loss(reg_layers):
    def reg_loss_term(y_true, y_pred):
        return tf.add_n([r.losses[0] for r in reg_layers])

    return reg_loss_term

model.compile(..., metrics=[..., get_reg_loss(reg_layers)])

Это добавляет сумму всех теряемых регуляризации как метри c к модели. , Недостатком этого подхода является то, что, когда вы хотите, чтобы индикатор выполнения отображал условия потери отдельных слоев, вам необходимо определить функцию с уникальным именем для каждого из упорядоченных слоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...