在Keras中使用自定义损失函数和学习质量指标

在训练集上训练神经网络时,会在神经网络的输出中计算学习效率的两个关键参数-误差和预测准确性。 为此,使用损失函数和精度度量。 这些度量因任务(分类或图像分割,对象检测,回归)而异。 在Keras,我们可以为特定任务定义自己的损失函数和准确性指标。 此类自定义函数将在本文中讨论。 谁在乎,请在猫下。

Keras中的自定义损失函数


例如,假设我们需要实现平均平均误差(MAE)误差函数。 定制MAE损失功能可以按以下方式实现:

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 

在这里,我们使用Keras中定义的sum,arange,mean和abs函数。

以同样的方式,您可以定义精度指标。 例如,定义earth_movers_distance指标以比较两个直方图:

 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) 

要使用我们的mae和earth_movers_distance指标,我们从一个单独的模块中导入相应的函数,并在编译模型时将它们添加到loss和metrics参数中:

 from utils.metrics import mae, earth_movers_distance loss = earth_movers_distance model.compile(optimizer=optimizer, loss=loss, metrics=[mae, "accuracy"]) 

使用自定义损失功能加载Keras模型


在Keras中训练模型时,可以将模型权重保存在h5文件中,以便在预测阶段随后加载训练后的模型。 如果我们使用自定义损失函数和质量指标,则可能会遇到问题。 当我们使用load_weights方法从h5文件中为模型加载训练后的权重时,会出现以下错误:

 ValueError: Unknown loss function:earth_movers_distance 

这是Keras中的一个著名错误( 他们在github的官方存储库中对此进行了描述)。

要解决该问题,您需要向Keras添加我们的自定义损失函数和质量指标:

 from keras.utils.generic_utils import get_custom_objects get_custom_objects().update({"earth_movers_distance": earth_movers_distance, "age_mae": age_mae}) 

现在就这些了。 祝大家好运,很快再见!

Source: https://habr.com/ru/post/zh-CN467363/


All Articles