在 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是
我认为我的损失是错误的,因为我使用了float y_pred。根据方程式
我认为我应该使用整数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:设置具有序列的数组元素。
我该如何弥补我的损失?我求平均值的想法是否正确?
答案 0 :(得分:1)
我认为函数np_utils.to_categorical()
需要array
,但它得到的sequence
就像tensor
一样。
我也遇到了问题,然后将np_utils.to_categorical()
更改为tf.one_hot
,它可以正常工作。
希望这会有所帮助:D