实施骰子输
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的分数,得到最终的标量损失。
我想像这样从 dice_loss_for_keras.py:
中实现 Dice Losefrom 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的分数,得到最终的标量损失。