Dice系数的正确实现方法是什么?两种代码结果差异咨询
Dice系数正确实现说明
两段代码都不存在逻辑错误,返回值差异来自二者统计Dice系数的口径不同,对应完全不同的使用场景:
Dice系数核心定义
标准Dice系数(也叫Sørensen–Dice系数,分割任务中等价于F1分数)的计算公式为:Dice = (2 * |真实标注与预测结果的交集|) / (|真实标注像素总数| + |预测结果像素总数|)
代码中的smooth是为了避免分母为0添加的平滑项,常规使用时取1e-5量级的极小值即可,取1时属于加入拉普拉斯平滑的修正版本,会给小目标样本的计算结果带来一定偏移。
两段代码的具体差异
dice_coef2计算的是全局Dice
它直接对整个输入batch的所有像素、所有通道求交集和并集的总和,再一次性计算比值。这种统计方式下,前景像素量大的样本会主导最终分数,小目标样本的误差会被大样本的结果稀释,很容易出现分数虚高,你得到的0.94就是全局口径下的计算结果。dice_coef1计算的是样本平均Dice
它指定在空间维度和通道维度axis=[1,2,3]上求和,也就是先给batch里每个独立样本单独计算各自的Dice值,最后再对所有样本的Dice取平均。这种方式下每个样本对最终分数的权重相同,不会出现大样本掩盖小样本误差的问题,是分割任务训练、验证阶段的主流实现方式,得到的0.85更能反映模型在单个样本上的平均分割效果。
使用建议
- 如果是竞赛要求提交整个测试集的全局Dice评分,使用
dice_coef2的逻辑即可 - 如果是训练过程中监控模型效果、评估模型对不同样本的通用分割能力,优先使用
dice_coef1的实现
内容的提问来源于stack exchange,提问作者Tom Berry
相关产品推荐
相关产品推荐

