如何以自定义Keras损耗将softmax输出转换为一热格式

时间:2018-09-10 12:11:07

标签: python tensorflow keras loss-function

2D语义细分任务中。我想在自定义的Keras损失函数中为每个类别计算平均骰子系数。

因此,我认为第一步是计算每个类别的骰子系数,然后平均系数以获得avg_dice。

现在我的损失函数看起来像

def avg_dice_coef(y_true, y_pred, n_classes, smooth=1e-5):
    # y_pred_new = K.variable(np_utils.to_categorical(K.argmax(y_pred), num_classes=OPTIONS.nb_classes))

    avg_dice = 0.  # 用于求和每个类别的骰子系数,之后求平均
    for class_index in range(n_classes):  # 对每个类别进行循环
        intersection = K.sum(y_true[:, :, :, class_index] * y_pred_new[:, :, :, class_index], axis=[1, 2])
        union = K.sum(y_true[:, :, :, class_index], axis=[1, 2]) + K.sum(y_pred_new[:, :, :, class_index], axis=[1, 2])
        dice_one_class = K.mean((2. * intersection + smooth) / (union + smooth), axis=0)
        avg_dice += dice_one_class
    return avg_dice / n_classes  # 之后求平均

在此函数中,y_pred是 softmax之后来自网络的输出,labelsshape =(批量大小,1024、512,n_classes),predicts_shape =(批量大小,1024、512,n_classes)

我认为我的损失是错误的,因为我使用了float y_pred。根据方程式

enter image description here

我认为我应该使用整数0或1 y_pred值而不是float。因此,我需要1)使用K.argmax()获得每个像素的最大值的索引,2)将K.argmax()的结果转换为单幅格式。(一个简单的示例:convert [0.1,0.1 ,0.8]到[0,0,1])

但是当我添加

y_pred_new = K.variable(np_utils.to_categorical(K.argmax(y_pred), num_classes=OPTIONS.nb_classes))

要实现此目标,我遇到了一个错误:

ValueError:设置具有序列的数组元素。

我该如何弥补我的损失?我求平均值的想法是否正确?

1 个答案:

答案 0 :(得分:1)

我认为函数np_utils.to_categorical()需要array,但它得到的sequence就像tensor一样。

我也遇到了问题,然后将np_utils.to_categorical()更改为tf.one_hot,它可以正常工作。

希望这会有所帮助:D