Cargando modelo con pérdida personalizada + keras

En Keras, si necesita tener una pérdida personalizada con parámetros adicionales, podemos usarlo como se menciona en https://datascience.stackexchange.com/questions/25029/custom-loss-function-with-additional-parameter-in- keras

def penalized_loss(noise): def loss(y_true, y_pred): return K.mean(K.square(y_pred - y_true) - K.square(y_true - noise), axis=-1) return loss 

El método anterior funciona cuando estoy entrenando el modelo. Sin embargo, una vez que el modelo está entrenado, estoy teniendo dificultades para cargar el modelo. Cuando bash usar el parámetro custom_objects en load_model como a continuación

 model = load_model(modelFile, custom_objects={'penalized_loss': penalized_loss} ) 

se queja de ValueError: Unknown loss function:loss

¿Hay alguna forma de pasar la función de pérdida como una de las pérdidas personalizadas en custom_objects ? De lo que puedo recostackr, la función interna no está en el espacio de nombres durante la llamada a load_model. ¿Hay alguna forma más fácil de cargar el modelo o usar una pérdida personalizada con parámetros adicionales?

¡Sí hay! custom_objects espera la función exacta que usó como función de pérdida (la interna en su caso):

 model = load_model(modelFile, custom_objects={ 'loss': penalized_loss(noise) }) 

Desafortunadamente, keras no almacenará en el modelo el valor del ruido, por lo que necesita alimentarlo a la función load_model manualmente.

Puedes probar esto:

 import keras.losses keras.losses.penalized_loss = penalized_loss 

(después de definir la función ‘penalized_loss’ en su archivo ‘py’ actual).