Les valeurs de perte et de métrique de Keras ne correspondent pas à la même fonction dans chaque
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 loss
et val_loss
dans 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_fn
utilisation 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_loss
de 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_loss
et val_custom_fn
ne correspondent pas (ni loss
ni loss_custom_fn
d'ailleurs).
C'est vraiment étrange, mon custom_fn
est essentiellement keras' intégré mape
avec le y_true
et y_pred
légèrement manipulé. Qu'est-ce qui se passe ici?
PS : les calques que j'utilise sont des LSTM
calques et un dernier Dense
calque. 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_fn
et en utilisant keras mape
comme fonction de perte et métrique comme suit :
model.compile(loss='mape', metrics=['mape'])
et pour plus de simplicité, la suppression ModelCheckpoint
du rappel a le même effet ; val_loss
et val_mape
pour 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
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_loss
et val_custom_fn
correspondent exactement à chaque époque.
Une solution de contournement simple consiste à utiliser le custom_fn
comme 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_loss
manuellement 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_fn
fois 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.