Keras 骰子系数大于1

Keras 骰子系数大于1,keras,deep-learning,image-segmentation,Keras,Deep Learning,Image Segmentation,当我在训练UNET时,骰子coef和iou有时会大于1,并且iou>dice,然后经过几批之后,它们会恢复正常。 如图所示 我将其定义如下: def dice_coef(y_true, y_pred, smooth=1): y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) intersection = K.sum(y_true_f * y_pred_f) return (2. * intersect

当我在训练UNET时,骰子coef和iou有时会大于1,并且
iou>dice
,然后经过几批之后,它们会恢复正常。 如图所示

我将其定义如下:

def dice_coef(y_true, y_pred, smooth=1):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

def iou(y_true, y_pred, smooth=1):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    union = K.sum(y_true_f) + K.sum(y_pred_f) - intersection
    return (intersection + smooth) / (union + smooth)

def dice_loss(y_true, y_pred):
    return 1. - dice_coef(y_true, y_pred)

我曾尝试将
K.abs()
添加到y\u pred,但这会导致性能更差。我觉得既然输出是sigmoid激活的,那么是否添加
K.abs()
应该会得到相同的结果?另外,正如你所看到的,我的准确性很奇怪,我一直依赖骰子来判断我的模型性能,如果有人能指出这个问题,我会做得更好

我相信您的
y\u true
图像可能不在0到1之间。。。。您确定它们不在0和255之间吗?或者他们只有一个通道(而不是三个通道?)

这不应该是原因,但您使用的是批处理骰子,您应该使用图像骰子:

def dice_coef(y_true, y_pred, smooth=1):
    y_true_f = K.batch_flatten(y_true)
    y_pred_f = K.batch_flatten(y_pred)

    intersection = K.sum(y_true_f * y_pred_f, axis=-1)
    sums = K.sum(y_true_f, axis=-1) + K.sum(y_pred_f, axis=-1)

    return (2. * intersection + smooth) / (sums + smooth)
通常,我使用
K.epsilon()
表示“平滑”(非常小的东西)

这同样适用于
iou

def iou(y_true, y_pred, smooth=1):
    y_true_f = K.batch_flatten(y_true)
    y_pred_f = K.batch_flatten(y_pred)

    intersection = K.sum(y_true_f * y_pred_f, axis=-1)
    union = K.sum(y_true_f, axis=-1) + K.sum(y_pred_f, axis=-1) - intersection
    return (intersection + smooth) / (union + smooth)
通道骰子示例:

#considering shape (batch, classes, image_size, image_size)
def dice_coef(y_true, y_pred, smooth=1):

    intersection = K.sum(y_true * y_pred, axis=[2,3])
    sums = K.sum(y_true, axis=[2,3]) + K.sum(y_pred, axis=[2,3])

    dice = (2. * intersection + smooth) / (sums + smooth)
    return K.mean(dice, axis=-1)

你的
y\u真的
图像真的介于0和1之间吗?检查此项。也许您可以共享您的
模型.summary()
,层的定义(至少是最后一层),以及
y\u true
的“测量”形状和范围。(我知道你说没关系,但有时我们会弄错,我们每个人:p)你是对的!!!我的y_真值不在(0,1)中:(我已经修复了它,谢谢Scool:)--所以如果你认为它解决了所有问题,请将答案标记为有效:)我的y_真值为1或0,并且具有形状(无,3,512,512),但它不是RBG,而是轴=1上连接的3个灰度遮罩。我使用“通道优先”数据格式。我可以知道为什么我应该使用图像骰子吗?为什么批量骰子>1?问题不是批量骰子。这不是大于1的原因,我仍然相信Yu-true或Yu-pred都有问题使用图像骰子更好,因为批量骰子对大的遮罩效果很好,但对小的遮罩效果很差。你甚至可以尝试一个通道骰子,因为你有3个通道。