首页 > 解决方案 > 在 Keras 中制定特定的自定义损失函数

问题描述

在此处输入图像描述

我正在尝试根据3 个输出变量来制定如上所述的自定义损失函数。本质上,我想通过取 y_true 或 y_pred 中的最大值来归一化每个输出的误差,即 abs(y_true - y_pred),然后将其总结为组合损失。

到目前为止我尝试过的

    def custom_loss(y_true, y_pred):
    
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    
    y_true_fc = K.cast(y_true_f, 'float32')
    y_pred_fc = K.cast(y_pred_f, 'float32')

    err = K.abs(y_true_fc - y_pred_fc)

    loss = K.sum(err)
    return loss

我收到一个错误:

TypeError: Value passed to parameter 'reduction_indices' has DataType float32 not in list of allowed values: int32, int64

我不确定是否需要 flatten() 或 K.cast(),但它似乎是基于我在 SO 中的搜索的标准流程。我应该如何从这里开始以获得分母的最大值,最后是组合损失?我认为我没有正确编写代码来反映方程式。

此外,上述公式是否对每批中的每个样本进行计算?

标签: pythonkeras

解决方案


您会收到此错误,因为K.max沿单个张量计算最大值(第二个参数表示缩减轴)。要找到两个张量之间的元素最大值,您可以使用K.maximum代替。以下函数实现了您的方程式:

def custom_loss(y_true, y_pred):
    y_true_c = K.cast(y_true, 'float32')  # Shape=(batch_size, 3)
    y_pred_c = K.cast(y_pred, 'float32')  # Shape=(batch_size, 3)

    # Compute error
    num = K.abs(y_true_c - y_pred_c)  # Shape=(batch_size, 3)
    den = K.maximum(y_true_c, y_pred_c)   # Shape=(batch_size, 3)
    err = K.sum(num / den, axis=-1)  # Shape=(batch_size,)

    # Output loss
    return K.mean(err)

可能没有必要强制转换您的输入。请注意,我不是平展输入,而是计算平均损失(通常的做法是计算平均值以汇总所有单独的损失)。

注意:未经测试。


推荐阅读