平滑骰子损失如何区分?

时间:2018-08-22 19:27:16

标签: tensorflow image-processing keras deep-learning image-segmentation

我正在通过最小化普遍用于此问题的dice_loss函数来训练keras中的U-Net:adapted from herehere

def dsc(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)
     score = (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
     return score

def dice_loss(y_true, y_pred):
    return (1 - dsc(y_true, y_pred))

此实现与traditional dice loss不同,因为它具有使“可区分”的平滑术语。我只是不明白如何在分母中添加smooth项而不是1e-7之类的词,因为它实际上会改变损耗值,因此会更好。我已经在具有常规dice实现的测试集上使用经过训练的unet模型进行了检查,如下所示:

def dice(im1,im2):
     im1 = np.asarray(im1).astype(np.bool)
     im2 = np.asarray(im2).astype(np.bool)
     intersection = np.logical_and(im1, im2)
     return np.float(2. * intersection.sum()) / (im1.sum() + im2.sum() + 1e-7))

有人可以解释为什么通常使用平滑骰子损失吗?

1 个答案:

答案 0 :(得分:3)

在损失中加上smooth并没有区别。使其与众不同的是
1.放宽预测的阈值:您不会将y_pred强制转换为np.bool,而是将其保留为介于0和1之间的连续
2.您不将集合运算用作np.logical_and,而是使用逐元素乘积来近似不可微交运算。

smoothy_pred都不包含任何前景像素时,仅添加y_true以避免被零除。