Ao treinar uma rede neural em um conjunto de treinamento, dois parâmetros principais de eficiência de aprendizado - erro e precisão de previsão - são calculados na saída da rede neural. Para isso, são utilizadas a função de perda e a métrica de precisão. Essas métricas diferem dependendo da tarefa (classificação ou segmentação de imagem, detecção de objeto, regressão). Na Keras, podemos definir nossa própria função de perda e métricas de precisão para nossa tarefa específica. Tais funções personalizadas serão discutidas no artigo. Quem se importa, por favor, debaixo do gato.
Funções de perda personalizadas em Keras
Por exemplo, suponha que precisamos implementar a função de erro Mean Average Error (MAE). A função de perda MAE personalizada pode ser implementada da seguinte maneira:
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
Aqui usamos as funções soma, arange, média e abs definidas em Keras.
Da mesma maneira, você pode definir sua métrica de precisão. Por exemplo, defina a métrica earth_movers_distance para comparar dois 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 nossas métricas mae e earth_movers_distance, importamos as funções correspondentes de um módulo separado e as adicionamos aos parâmetros de perda e métricas ao compilar o modelo:
from utils.metrics import mae, earth_movers_distance loss = earth_movers_distance model.compile(optimizer=optimizer, loss=loss, metrics=[mae, "accuracy"])
Carregando um modelo Keras com função de perda personalizada
Ao treinar um modelo no Keras, você pode salvar os pesos do modelo em um arquivo h5 para carregamento subsequente do modelo treinado no estágio de previsão. Se usarmos funções personalizadas de perda e métricas de qualidade, podemos encontrar um problema. Quando carregamos os pesos treinados do arquivo h5 para o modelo usando o método load_weights, podemos obter o seguinte erro:
ValueError: Unknown loss function:earth_movers_distance
Este é um bug famoso no Keras (
eles escreveram sobre isso no repositório oficial no github).
Para resolver o problema, você precisa adicionar nossas funções de perda personalizadas e métricas de qualidade ao Keras:
from keras.utils.generic_utils import get_custom_objects get_custom_objects().update({"earth_movers_distance": earth_movers_distance, "age_mae": age_mae})
Por enquanto é tudo. Boa sorte a todos e até breve!