Al entrenar una red neuronal en una muestra de entrenamiento, se calculan dos parámetros clave de la eficiencia del aprendizaje: error y precisión de predicción, a la salida de la red neuronal. Para esto, se utilizan la función de pérdida y la métrica de precisión. Estas métricas difieren según la tarea (clasificación o segmentación de imágenes, detección de objetos, regresión). En Keras, podemos definir nuestra propia función de pérdida y métricas de precisión para nuestra tarea específica. Dichas funciones personalizadas se discutirán en el artículo. A quién le importa, por favor, debajo del gato.
Funciones de pérdida personalizadas en Keras
Por ejemplo, supongamos que necesitamos implementar la función de error de error medio promedio (MAE). La función de pérdida de MAE personalizada se puede implementar de la siguiente manera:
from keras import backend as K def mae(y_true, y_pred): true_value = K.sum(y_true * K.arange(0, 100, dtype="float32"), axis=-1) pred_value = K.sum(y_pred * K.arange(0, 100, dtype="float32"), axis=-1) mae = K.mean(K.abs(true_value - pred_value)) return mae
Aquí usamos las funciones sum, arange, mean y abs definidas en Keras.
Del mismo modo, puede definir su métrica de precisión. Por ejemplo, defina la métrica earth_movers_distance para comparar dos histogramas:
from keras import backend as K def earth_movers_distance(y_true, y_pred): cdf_true = K.cumsum(y_true, axis=-1) cdf_pred = K.cumsum(y_pred, axis=-1) emd = K.sqrt(K.mean(K.square(cdf_true - cdf_pred), axis=-1)) return K.mean(emd)
Para usar nuestras métricas mae y earth_movers_distance, importamos las funciones correspondientes de un módulo separado y las agregamos a los parámetros de pérdida y métrica al compilar el modelo:
from utils.metrics import mae, earth_movers_distance loss = earth_movers_distance model.compile(optimizer=optimizer, loss=loss, metrics=[mae, "accuracy"])
Carga de un modelo Keras con función de pérdida personalizada
Al entrenar un modelo en Keras, puede guardar el peso del modelo en un archivo h5 para cargarlo posteriormente en la etapa de predicción. Si utilizamos funciones de pérdida personalizadas y métricas de calidad, entonces podemos encontrarnos con un problema. Cuando cargamos los pesos entrenados del archivo h5 para el modelo usando el método load_weights, podemos obtener el siguiente error:
ValueError: Unknown loss function:earth_movers_distance
Este es un error famoso en Keras (
escribieron sobre ello en el repositorio oficial en github).
Para resolver el problema, debe agregar nuestras funciones de pérdida personalizadas y métricas de calidad a Keras:
from keras.utils.generic_utils import get_custom_objects get_custom_objects().update({"earth_movers_distance": earth_movers_distance, "age_mae": age_mae})
Eso es todo por ahora. ¡Buena suerte a todos y hasta pronto!