Los valores de pérdida y métricas de Keras no coinciden con la misma función en cada
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 loss
y val_loss
en 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_fn
usando 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_loss
de 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_loss
ya val_custom_fn
no coinciden (ni loss
ni loss_custom_fn
por asomo).
Esto es realmente extraño, mi custom_fn
es esencialmente keras integrado mape
con el y_true
y y_pred
ligeramente manipulado. ¿que esta pasando aqui?
PD : las capas que estoy usando son LSTM
capas y una Dense
capa 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_fn
y usando keras incorporados mape
como función de pérdida y métrica como esta:
model.compile(loss='mape', metrics=['mape'])
y para simplificar, eliminar ModelCheckpoint
la devolución de llamada tiene el mismo efecto; val_loss
y val_mape
para 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
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_loss
y val_custom_fn
coincidieron exactamente en cada época.
Una solución sencilla es usar custom_fn
como 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_loss
manualmente después de entrenar cada época. Esto último parece tener más sentido ya que no hay razón para incluir custom_fn
tanto 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.