骰子损失给出二进制输出,而二进制交叉熵产生概率输出图

人工智能 深度学习 卷积神经网络 喀拉斯 目标函数
2021-10-31 20:36:18

根据 stackoverflow 上 Kanak 的推荐,我在这里发布了这个问题:

目前我正在为我的二值图像分割问题尝试各种损失函数和优化器。然而,我在 Unet 中使用的损失函数给出了不同的输出分割图。

我有一个高度不平衡的数据集,因此我正在尝试骰子损失,下面给出了自定义函数。

    def dice_coef(y_true, y_pred, smooth=1):
        """
        Dice = (2*|X & Y|)/ (|X|+ |Y|)
             =  2*sum(|A*B|)/(sum(A^2)+sum(B^2))
        ref: https://arxiv.org/pdf/1606.04797v1.pdf
        """
        intersection = K.sum(K.abs(y_true * y_pred), axis=-1)
        return (2. * intersection + smooth) / (K.sum(K.square(y_true), -1) + K.sum(K.square(y_pred), -1) + smooth)

    def dice_coef_loss(y_true, y_pred):
        return 1 - dice_coef(y_true, y_pred)

二进制交叉熵产生一个概率输出图,其中每个像素都有一个颜色强度,表示该像素是正类或负类的机会。但是,当我使用骰子损失函数时,输出不是概率图,而是像素被分类为 0 或 1。

我的问题是:

1.这些不同的损失函数怎么可能有这些截然不同的结果?

  1. 有没有办法自定义骰子损失函数,使输出分割图是类似于二元交叉熵损失的概率图。
1个回答

概率图/输出不是由您的损失函数产生的,而是由您的输出层产生的,它由 softmax 或 sigmoid 激活。

换句话说,你的骰子损失输出也是一个概率图。它只是对自己非常有信心。如果您暂时忘记了潜在的过度拟合问题并训练您的二元交叉熵模型更长时间,概率值最终将全部收敛到两端(0 和 1)。

根据我的经验,对于语义分割,dice loss 和 IOU 的收敛速度往往比二元交叉熵快得多,因此如果你尽早停止训练,dice loss 会产生一个比二元交叉熵更类似于二值化输出的概率图。