Keras 语义分割的自定义骰子损失

时间:2021-05-17 15:26:23

标签: python tensorflow keras dice loss

我有以下自定义骰子损失代码,用于 keras tensorflow 中的语义分割。该函数应该能够预测多个类别,但对于这种情况,我将 num_classes 设置为 2,因为我只需要背景和蒙版。

    def dice(y_true, y_pred, num_classes=2, smooth=1e-7, ignore_background=False):

    y_true = K.one_hot(K.cast(y_true, 'int32'), num_classes=num_classes)[..., 1:] if ignore_background else K.one_hot(
        K.cast(y_true, 'int32'), num_classes=num_classes)
    y_true_f = K.flatten(y_true)
    y_pred = y_pred[..., 1:] if ignore_background else y_pred
    y_pred_f = K.flatten(y_pred)

    intersect = reduce_sum(y_true_f, axis=-1) * reduce_sum(y_pred_f, axis=-1)
    denom = reduce_sum(y_true_f, axis=-1) + reduce_sum(y_pred_f, axis=-1)

    dice = K.mean((2. * intersect / (denom + smooth)))

    return dice
    def dice_loss(y_true, y_pred):
    
    print('y_true.shape: ', y_true.shape, 'y_pred.shape: ', y_pred.shape)
    return 1 - dice(y_true, y_pred)

我正在训练的模型预测两个掩码和两个背景连接在两个数组中,因此输出的形状为 (256, 256, 2), (256, 256, 2)。

该模型没有训练,损失曲线很快就达到了 E-6,此后不再改变。我不知道我在这里做错了什么。我打印了 y_true 和 y_pred 的形状,结果如下:y_true.shape: (None, None, None, None) y_pred.shape: (None, 256, 256, 2).

0 个答案:

没有答案