实施骰子输

Implementing Dice Lose

我想像这样从 dice_loss_for_keras.py:

中实现 Dice Lose
from keras import backend as K

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)

唯一的问题是,在大多数 UNET 实现中,y_true 有 1 个通道而 y_pred 有 3 个通道(例如 3 类),因为 y_pred由热向量表示。 是否可以将 y_true 转换为 y_pred 或相反,或者将 UNET 输出为 1 个通道,如 y_true

您需要将 y_true 转换为 1-hot 表示,以便应用每个 class 骰子损失。 似乎您有 功能可以为您完成。

一旦 y_true 的形状与 y_pred 相同,您就可以使用代码计算每个 class[=20= 的骰子得分 ],然后合并所有classes的分数,得到最终的标量损失。