tensorflow - 平滑骰子损失如何区分?
问题描述
我正在通过最小化dice_loss
普遍用于此问题的函数来训练 keras 中的 U-Net:改编自此处和此处
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))
这种实现不同于传统的骰子损失,因为它有一个平滑项来使其“可微”。我只是不明白如何添加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
损失并不能使其可区分。使其可区分的原因是
1. 放宽预测的阈值:您不强制y_pred
转换为np.bool
,而是将其保留为0 和 1 之间的连续
值
2. 您不使用集合操作 as np.logical_and
,而是使用元素乘积来近似不可微相交运算。
仅当两者且不包含任何前景像素时才添加smooth
以避免偏差为零。y_pred
y_true
推荐阅读
- javascript - 是否可以使用 Angular 在运行时从系统环境变量中获取数据?
- r - 数学方程符号 $$ 不会在 r markdown 输出中消失
- aframe - 添加mtl时obj文件变白
- r - 将参数传递给geom_qq中的分布
- php - 循环遍历 php 中 JSONArray 的值
- influxdb - InfluxDB 禁用下采样
- php - 从服务器发送的文本消息的格式
- python-3.x - 表数据未在 python selenium 中检索
- javascript - UploadComplete 事件未在 plupload 中触发
- ios - IOS 在 Google SignIn React Native Expo 32 上崩溃