Les valeurs de perte et de métrique de Keras ne correspondent pas à la même fonction dans chaque

Aug 18 2020

J'utilise keras avec une fonction de perte personnalisée comme ci-dessous :

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

Alors j'appelle model.compile(loss=custom_fn)etmodel.fit(X, y,..validation_data=(X_val, y_val)..)

Keras enregistre alors losset val_lossdans l'historique du modèle. Pour vérifier l'intégrité, lorsque le modèle termine la formation, j'utilise model.predict(X_val)pour pouvoir calculer manuellement la perte de validation avec mon custom_fnutilisation du modèle formé.

J'enregistre le modèle avec la meilleure époque en utilisant ce rappel :

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

donc après avoir calculé cela, la perte de validation doit correspondre à la valeur de keras val_lossde la meilleure époque. Mais ce n'est pas le cas.

Comme une autre tentative pour résoudre ce problème, je fais aussi ceci:

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

Et à ma grande surprise, val_losset val_custom_fnne correspondent pas (ni lossni loss_custom_fnd'ailleurs).

C'est vraiment étrange, mon custom_fnest essentiellement keras' intégré mapeavec le y_trueet y_predlégèrement manipulé. Qu'est-ce qui se passe ici?

PS : les calques que j'utilise sont des LSTMcalques et un dernier Densecalque. Mais je pense que cette information n'est pas pertinente pour le problème. J'utilise également la régularisation comme hyperparamètre mais pas l'abandon.

Mise à jour

Même en supprimant custom_fnet en utilisant keras mapecomme fonction de perte et métrique comme suit :

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

et pour plus de simplicité, la suppression ModelCheckpointdu rappel a le même effet ; val_losset val_mapepour chaque époque ne sont pas équivalents . C'est extrêmement étrange pour moi. Il me manque quelque chose ou il y a un bogue dans le code Keras... le premier pourrait être plus réaliste.

Réponses

3 user7331538 Aug 18 2020 at 19:34

Ce billet de blog suggère que keras ajoute toute régularisation utilisée dans la formation lors du calcul de la perte de validation. Et évidemment, lors du calcul de la métrique de choix, aucune régularisation n'est appliquée. C'est pourquoi cela se produit avec n'importe quelle fonction de perte de choix comme indiqué dans la question.

C'est quelque chose sur lequel je n'ai trouvé aucune documentation de Keras. Cependant, cela semble tenir puisque lorsque je supprime tous les hyperparamètres de régularisation, les val_losset val_custom_fncorrespondent exactement à chaque époque.

Une solution de contournement simple consiste à utiliser le custom_fncomme métrique et à enregistrer le meilleur modèle basé sur la métrique ( val_custom_fn) que sur le val_loss. Ou bien bouclez chaque époque manuellement et calculez la bonne val_lossmanuellement après avoir entraîné chaque époque. Ce dernier semble avoir plus de sens puisqu'il n'y a aucune raison d'inclure à la custom_fnfois comme métrique et comme fonction de perte.

Si quelqu'un peut trouver des preuves de cela dans la documentation de Keras, cela serait utile.