在Keras中制定特定的自定义损失函数

时间:2019-01-31 08:44:37

标签: python keras

[![在此处输入图片描述] [1]] [1]

我正在尝试基于 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中的搜索,这似乎是标准流程。我应该如何从这里着手,以便获得分母的最大值,最后得到合并损失?我认为我编写的代码无法正确反映方程式。

还可以用上述公式对每批中的每个样品进行计算吗?

1 个答案:

答案 0 :(得分:1)

您会收到此错误,因为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)

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

注意:未测试。