困难:类别不平衡,label size很小。
思路:
- loss上给其加权,使其focus小区域(最简单直接)
- loss合理优化,使其关注小区域
- 网络结构
这有一个篇非常好的loss function 总结。[传送门]
0.评价指标
一般使用dice衡量区域的重合程度,使用95%的HD( Hausdorff Distance)去衡量边界的重合程度,之所以取95%,是因为要滤去5%的离群点。但其实,虽然有两个指标,95hd经常不是主动优化的【paper】。一般dice小了,95HD就小了,因此大多数人使用dice loss作为梯度下降的loss。
1.dice loss
我们先看看dice 系数定义。
看图非常好理解。dice loss根据其改编。
原paper地址:http://campar.in.tum.de/pub/milletari2016Vnet/milletari2016Vnet.pdf
简单来说,相对于交叉熵,就是不用加了权重,而VNet中的改进的dice loss是基于IOU loss进行优化的,这样子改善了梯度传播。但是小物体训练的时候很敏感,训练比较震荡。
2. cross-entropy loss
上面就是CEloss,x[class]表示该类的得分,分母是整体的得分相加,这里使用了softmax做归一化。此时没有考虑类别不平衡。简而言之就是一个log softmax+NLLloss。 第二步是分子e的指数和log抵消了。
加权了之后得到的最终式子。
公式 From:https://pytorch.org/docs/stable/nn.html?highlight=bce#torch.nn.CrossEntropyLoss
3. focal loss
仔细看与CEloss区别,这个gamma目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。首先pt的范围是0到1,所以不管γ是多少,这个调制系数都是大于等于0的。易分类的样本再多,你的权重很小,那么对于total loss的共享也就不会太大。那么怎么控制样本权重呢?举个例子,假设一个二分类,样本x1属于类别1的pt=0.9,样本x2属于类别1的pt=0.6,显然前者更可能是类别1,假设γ=1,那么对于pt=0.9,调制系数则为0.1;对于pt=0.6,调制系数则为0.4,这个调制系数就是这个样本对loss的贡献程度,也就是权重,所以难分的样本(pt=0.6)的权重更大。
实际调focal loss时候,发现其处理类别不均衡效果很差,与原文初衷相抵,其中weight我是用label的逆样本频率,gamma=2。1:100时候效果还行,当1:1000时,效果较差。这一矛盾尚待补充。
4.Generalized Dice Loss (GDL)
paper:Generalised Dice overlap as a deep learning loss function for highly unbalanced segmentations
rln指的是类别l在第n个像素的标准值(GT),pln为相应的预测概率,wl为每个类别权重。可以从pixel-wise这么理解分子,
- 该像素GT1的值 x 该像素预测为GT1的概率 + 该像素GT2的值 x 该像素预测为GT2的概率
个人觉得分母的出现是因为把loss右边式子控制到0-1,因为x+y>=2xy,然后负号就是因为右边式子越大越好,加上后,整个loss越小越好。
注意:一个类的体素至少比其他类高3个数量级。否则,在大多数情况下,使用标准的DiceLoss比GDL工作得更好
reference