欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对Dice loss的理解

程序员文章站 2023-12-31 20:38:22
...

对Dice loss的理解


Dice loss适用于图像的二值分割,且一定程度上能缓解正负样本在数量上不平衡的问题。相比的其它的代价函数,Dice loss显得非常的抽象,所以本文将解释Dice loss为什么能够解决正负样本不平衡的问题。

论文原文:V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation

Dice loss的表达式为:
对Dice loss的理解
其中 y i \rm{y}_{\rm{i}} yi y ^ i \rm{\hat y}_{\rm{i}} y^i分别是像素 i {\rm{i}} i的标签值与预测值。 N {\rm{N}} N为像素点的总数,为单张图片像素的数量乘上batch size。可见Dice loss是一种区域性的代价函数,即网络的全部输出都会影响像素 i {\rm{i}} i处的网络梯度。

假设 i = 1 {\rm{i = 1}} i=1,我们对该处像素的输出值求偏导(梯度)可得:
对Dice loss的理解
可见,若 y 1 = 0 \rm{y}_{\rm{1}}=0 y1=0,则该像素点梯度为正,则网络会向 y ^ 1 = 0 \rm{\hat y}_{\rm{1}}=0 y^1=0的方向进行优化;若 y 1 = 1 \rm{y}_{\rm{1}}=1 y1=1,则该像素点梯度为负,则网络会向 y ^ 1 = 1 \rm{\hat y}_{\rm{1}}=1 y^1=1方向进行优化。

接下来我们对 ∑ i = 1 N y i ⋅ y ^ i \sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} \cdot\rm{\hat y}_{\rm{i}} i=1Nyiy^i ∑ i = 1 N y i \sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} i=1Nyi ∑ i = 1 N y ^ i \sum\nolimits_{{\rm{i}} = 1}^N\rm{\hat y}_{\rm{i}} i=1Ny^i三者的值进行比较。假设网络的输出仅一张图片,即一个二维矩阵,设网络的标签图像 Y \rm{Y} Y与输出图像 Y ^ \rm{\hat Y} Y^分别为:
对Dice loss的理解对Dice loss的理解
那么 Y ⋅ Y ^ \rm{Y} \cdot\rm{\hat Y} YY^为:
对Dice loss的理解
所以有: ∑ i = 1 N y i ⋅ y ^ i < ∑ i = 1 N y i < ∑ i = 1 N y ^ i \sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} \cdot\rm{\hat y}_{\rm{i}}< \sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} < \sum\nolimits_{{\rm{i}} = 1}^N\rm{\hat y}_{\rm{i}} i=1Nyiy^i<i=1Nyi<i=1Ny^i,所以 ∑ i = 1 N y i + ∑ i = 1 N y ^ i − ∑ i = 1 N y i ⋅ y ^ i > ∑ i = 1 N y i ⋅ y ^ i \sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}}+\sum\nolimits_{{\rm{i}} = 1}^N\rm{\hat y}_{\rm{i}}-\sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} \cdot\rm{\hat y}_{\rm{i}}>\sum\nolimits_{{\rm{i}} = 1}^N\rm{y}_{\rm{i}} \cdot\rm{\hat y}_{\rm{i}} i=1Nyi+i=1Ny^ii=1Nyiy^i>i=1Nyiy^i。所以阳性像素的网络梯度将大于阴性像素,因此正负样本不平衡的问题得以缓解。
最后附上代码:

from tensorflow.keras import backend as K
def Dice_loss(y_true, y_pred):
    smooth = 1.
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = y_true_f * y_pred_f
    score = (2. * K.sum(intersection) + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    return 1. - score

这段代码好像是从github上找的,具体是那个项目,我也搞忘了,感谢大佬分享!
若有不当,敬请指正,谢谢!

上一篇:

下一篇: