Los valores de pérdida y métricas de Keras no coinciden con la misma función en cada

Aug 18 2020

Estoy usando keras con una función de pérdida personalizada como la siguiente:

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

Entonces estoy llamando model.compile(loss=custom_fn)ymodel.fit(X, y,..validation_data=(X_val, y_val)..)

Keras está entonces guardando lossy val_lossen el historial del modelo. Como verificación de cordura, cuando el modelo termina de entrenarse, lo estoy usando model.predict(X_val)para poder calcular la pérdida de validación manualmente custom_fnusando el modelo entrenado.

Estoy guardando el modelo con la mejor época usando esta devolución de llamada:

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

entonces, después de calcular esto, la pérdida de validación debe coincidir con el valor de keras val_lossde la mejor época. Pero esto no está sucediendo.

Como otro intento de resolver este problema, también estoy haciendo esto:

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

Y para mi sorpresa, val_lossya val_custom_fnno coinciden (ni lossni loss_custom_fnpor asomo).

Esto es realmente extraño, mi custom_fnes esencialmente keras integrado mapecon el y_truey y_predligeramente manipulado. ¿que esta pasando aqui?

PD : las capas que estoy usando son LSTMcapas y una Densecapa final. Pero creo que esta información no es relevante para el problema. También estoy usando la regularización como hiperparámetro pero no abandono.

Actualizar

Incluso eliminando custom_fny usando keras incorporados mapecomo función de pérdida y métrica como esta:

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

y para simplificar, eliminar ModelCheckpointla devolución de llamada tiene el mismo efecto; val_lossy val_mapepara cada época no son equivalentes . Esto es extremadamente extraño para mí. Me estoy perdiendo algo o hay un error en el código de Keras... lo primero podría ser más realista.

Respuestas

3 user7331538 Aug 18 2020 at 19:34

Esta publicación de blog sugiere que Keras agrega cualquier regularización utilizada en el entrenamiento al calcular la pérdida de validación. Y obviamente, al calcular la métrica de elección no se aplica ninguna regularización. Es por eso que ocurre con cualquier función de pérdida de elección como se indica en la pregunta.

Esto es algo sobre lo que no pude encontrar ninguna documentación de Keras. Sin embargo, parece mantenerse desde que eliminé todos los hiperparámetros de regularización, val_lossy val_custom_fncoincidieron exactamente en cada época.

Una solución sencilla es usar custom_fncomo métrica y guardar el mejor modelo basado en la métrica ( val_custom_fn) que en val_loss. O bien, recorra cada época manualmente y calcule la correcta val_lossmanualmente después de entrenar cada época. Esto último parece tener más sentido ya que no hay razón para incluir custom_fntanto una métrica como una función de pérdida.

Si alguien puede encontrar alguna evidencia de esto en la documentación de Keras, sería útil.