对Dice loss的理解
对Dice loss的理解
Dice loss适用于图像的二值分割,且一定程度上能缓解正负样本在数量上不平衡的问题。相比的其它的代价函数,Dice loss显得非常的抽象,所以本文将解释Dice loss为什么能够解决正负样本不平衡的问题。
论文原文:V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
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,我们对该处像素的输出值求偏导(梯度)可得:
可见,若
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=1Nyi⋅y^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^分别为:
那么
Y
⋅
Y
^
\rm{Y} \cdot\rm{\hat Y}
Y⋅Y^为:
所以有:
∑
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=1Nyi⋅y^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^i−∑i=1Nyi⋅y^i>∑i=1Nyi⋅y^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上找的,具体是那个项目,我也搞忘了,感谢大佬分享!
若有不当,敬请指正,谢谢!