【问题标题】:How is the smooth dice loss differentiable?平滑骰子损失如何区分?
【发布时间】:2019-01-29 03:04:33
【问题描述】:

我正在 keras 中训练 U-Net,方法是最小化通常用于此问题的 dice_loss 函数: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))

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

【问题讨论】:

  • 你为什么认为smooth这个术语使得损失函数可微分?
  • 很确定我在某处读过它,但我可能混淆了这些概念。
  • 在'smooth dice'中和'soft dice'一样吗?
  • @MonicaHeddneck 我相信是的!

标签: tensorflow image-processing keras image-segmentation semantic-segmentation


【解决方案1】:

smooth 添加到损失中并不能使其可微。使它与众不同的是
1. 放宽预测阈值:不要将y_pred 转换为np.bool,而是将其保留为介于 0 和 1 之间的连续
2.你没有像np.logical_and那样使用集合运算,而是使用元素乘积来逼近不可微的交集运算。

y_predy_true 均不包含任何前景像素时,您只需添加smooth 以避免除零。

【讨论】:

  • 谢谢!我把所有的事情都混在了脑海里。只是为了跟进,如果我使用平滑项 = 1 进行训练,我应该使用相同的平滑项 = 1 进行推理吗?我最初使用了一个非常小的值来避免被零除,但是平滑 =1 而不是 1e-7 似乎可以更好地提高我的结果
  • 我想在推理过程中你需要报告准确的骰子损失,而不是平滑的。 @nababs
  • @Shal,你好,对于“放宽门槛”,你是什么意思?什么都不做,还是剪掉它?
  • @AlexLuya 你根本没有阈值——阈值是不可区分的
  • @Shai,谢谢,我知道,只是想知道什么样的“松弛阈值”是可区分的
猜你喜欢
  • 2022-07-25
  • 2021-06-06
  • 2021-03-08
  • 2017-10-23
  • 2021-05-07
  • 2018-08-07
  • 2021-03-15
  • 2019-10-19
  • 2020-10-27
相关资源
最近更新 更多