【问题标题】:Dice coef greater than 1骰子系数大于 1
【发布时间】:2020-05-22 05:27:39
【问题描述】:

我在训练UNET时,dice coef和iou有时会大于1和iou > dice,然后经过几批又恢复正常。 如picture所示。

我将它们定义如下:

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_pred 中,但这会导致性能下降。我觉得由于输出是 sigmoid 激活的,是否添加 K.abs() 应该给出相同的结果?另外,正如您所看到的,我的准确性很奇怪,我一直依靠骰子来判断我的模型性能,如果有人能指出这个问题,那就更好了。

【问题讨论】:

  • 你的y_true图片真的在0到1之间吗?检查这个。
  • 也许您可以分享您的model.summary()、层的定义(至少是最后一层)、y_true 的“测量”形状和范围。 (我知道你说没关系,但有时我们会误会,我们每个人:p)
  • 你是对的!!!我的 y_ture 不在 (0,1) 中 :( 我已经修好了,谢谢
  • 酷 :) -- 所以如果你认为它解决了所有问题,请将答案标记为有效 :)

标签: keras deep-learning image-segmentation


【解决方案1】:

我相信您的y_true 图像可能不在 0 和 1 之间的范围内......您确定它们不在 0 和 255 之间吗?或者他们只有一个频道(而不是 3 个频道?)

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

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_true 是 1 或 0 并且形状为(无、3、512、512),但它不是 RBG,而是在轴 = 1 上连接的 3 个灰度蒙版。我使用了“通道优先”数据格式。我可以知道为什么要使用图像骰子吗?为什么批量骰子 > 1?
  • 问题不在于批量骰子。这不是 > 1 的原因,我仍然认为 y_true 或 y_pred 有问题。 --- 使用图像骰子更好,因为批量骰子适用于大掩码,但对于小掩码非常非常糟糕。
  • 您甚至可以尝试频道骰子,因为那里有 3 个频道。
猜你喜欢
  • 2022-09-24
  • 2021-03-12
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2022-07-25
  • 2020-08-12
相关资源
最近更新 更多