Значения потерь и метрик Keras не соответствуют одной и той же функции в каждом

Aug 18 2020

Я использую keras с настраиваемой функцией потерь, как показано ниже:

def custom_fn(y_true, y_pred):
   # changing y_true, y_pred values systematically
   return mean_absolute_percentage_error(y_true, y_pred)
   

Тогда я звоню model.compile(loss=custom_fn)иmodel.fit(X, y,..validation_data=(X_val, y_val)..)

Керас затем сохраняется lossи val_lossв истории модели. В качестве проверки работоспособности, когда модель завершает обучение, я использую, model.predict(X_val)поэтому я могу вычислить потерю проверки вручную, custom_fnиспользуя обученную модель.

Я сохраняю модель с лучшей эпохой, используя этот обратный вызов:

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))

поэтому после расчета потеря проверки должна соответствовать val_lossзначению keras для лучшей эпохи. Но этого не происходит.

В качестве еще одной попытки разобраться в этой проблеме я также делаю следующее:

    model.compile(loss=custom_fn, metrics=[custom_fn])

И к моему удивлению, val_lossи val_custom_fnне совпадают (ни lossили loss_custom_fnпо этому вопросу).

Это действительно странно, мой custom_fn, по существу keras' построен в mapeс y_trueи y_predслегка манипулировали. что происходит здесь?

PS : слои, которые я использую, - это LSTMслои и последний Denseслой. Но я думаю, что эта информация не имеет отношения к проблеме. Я также использую регуляризацию как гиперпараметр, но не отсев.

Обновлять

Даже удаление custom_fnи использование встроенных keras в mapeкачестве функции потерь и метрики, например:

model.compile(loss='mape', metrics=['mape'])

и для простоты удаление ModelCheckpointобратного вызова имеет тот же эффект; val_lossи val_mapeдля каждой эпохи не равнозначны . Для меня это очень странно. Я либо что-то упускаю, либо в коде Keras есть ошибка ... первое может быть более реалистичным.

Ответы

3 user7331538 Aug 18 2020 at 19:34

В этом сообщении в блоге предполагается, что keras добавляет любую регуляризацию, используемую в обучении, при вычислении потери проверки. И, очевидно, при вычислении выбранной метрики регуляризация не применяется. Вот почему это происходит с любой функцией потерь по выбору, как указано в вопросе.

Это то, о чем я не смог найти никакой документации от Кераса. Однако, похоже, что это не работает, поскольку, когда я удаляю все гиперпараметры регуляризации, val_lossи val_custom_fnсовпадают точно в каждую эпоху.

Простой обходной путь - использовать в custom_fnкачестве метрики и сохранить лучшую модель на основе метрики ( val_custom_fn), а не на основе val_loss. Или же пролистайте каждую эпоху вручную и вычислите правильное val_lossвручную после тренировки каждой эпохи. Последнее кажется более разумным, поскольку нет причин включать custom_fnи как метрику, и как функцию потерь.

Если кто-нибудь может найти какие-либо доказательства этого в документации Keras, это будет полезно.