光滑的骰子损失如何微分?
How is the smooth dice loss differentiable?
我正在 keras 中通过最小化通常用于此问题的 dice_loss
函数来训练 U-Net:adapted from here and here
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 不同,因为它有一个平滑项使其成为 "differentiable"。我只是不明白如何在分母中添加 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
添加到损失中并不能使其可微。使它与众不同的是
- 放宽预测阈值:您不会将
y_pred
转换为 np.bool
,但将其保留为 0 到 1 之间的 连续 值
- 您不像
np.logical_and
那样使用集合运算,而是使用逐元素乘积来近似不可微交运算。
当 y_pred
和 y_true
都不包含任何前景像素时,您只需添加 smooth
以避免被零除。
我正在 keras 中通过最小化通常用于此问题的 dice_loss
函数来训练 U-Net:adapted from here and here
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 不同,因为它有一个平滑项使其成为 "differentiable"。我只是不明白如何在分母中添加 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
添加到损失中并不能使其可微。使它与众不同的是
- 放宽预测阈值:您不会将
y_pred
转换为np.bool
,但将其保留为 0 到 1 之间的 连续 值 - 您不像
np.logical_and
那样使用集合运算,而是使用逐元素乘积来近似不可微交运算。
当 y_pred
和 y_true
都不包含任何前景像素时,您只需添加 smooth
以避免被零除。