我正在使用Keras训练一个U-Net模型,通过最小化dice_loss
函数来解决这个问题。这个函数在这个链接(参考自此)和(参考自此)中广泛使用。
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))
这个实现与传统的Dice Loss不同,因为它有一个平滑项以使其“可微分”。我只是不理解为什么在分母中添加smooth
项而不是像1e-7
之类的东西会使它更好,因为它实际上改变了损失值。使用训练有素的Unet模型在测试集上进行正常的Dice Loss
实现如下所示,我已经通过了检验:
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))
有人可以解释一下为什么光滑的骰子损失通常被使用吗?