语义分割中常用的损失函数

前言

   语义分割任务可以看作像素级的分类任务,在设计基于语义分割的深度学习架构时,尤其是在伪装目标分割的特殊场景下,损失/目标函数的选择非常关键,会直接影响到算法的学习过程,进而影响到模型的收敛速度、分割准确度。

   目前,语义分割种常用的损失函数包括cross entropy, generalized dice coefficient, focal loss 等。

1. cross entropy交叉熵

   逐像素的交叉熵是语义分割中最常用的一种损失函数,一般用来量化两个概率分布之间的差异。
(1)对于二分类的情况,其公式如下:
L = 1 N ∑ i − [ y i ⋅ l o g ( p i ) + ( 1 − y i ) ⋅ l o g ( 1 − p i ) ] L=\frac{1}{N} \sum_i -[y_i \cdot log(p_i)+(1-y_i) \cdot log(1-p_i)] L=N1i[yilog(pi)+(1yi)log(1pi)]

其中:

  • y i y_i yi表示样本i的label,正类为1,负类为-
  • p I p_I pI表示样本i预测为正类的概率

(2)对于多分类的情况
L = − 1 N ∑ i ∑ c = 1 M y i c l o g ( p i c ) L=- \frac{1}{N} \sum_i \sum_{c=1}^M y_{ic}log(p_{ic}) L=N1

### 语义分割使用的损失函数类型及应用场景 #### 交叉熵损失函数 (Cross-Entropy Loss) 交叉熵损失函数是最常用损失函数之一,在多类分类问题中表现良好。对于像素级别的分类任务,即每个像素属于某一特定类别,该损失函数能够有效地衡量预测分布与真实标签之间的差异。 ```python import torch.nn as nn criterion = nn.CrossEntropyLoss() ``` 此方法简单易实现,但在处理不平衡数据集时效果不佳[^2]。 #### Dice 损失函数 (Dice Loss) 针对样本极度不均衡的情况,Dice损失是一个不错的选择。它基于Sørensen-Dice系数计算两个集合间的相似度,特别适合于前景背景比例悬殊的任务。然而,直接应用可能会导致训练过程中的梯度消失现象,从而影响收敛速度和稳定性[^4]。 ```python def dice_loss(pred, target): smooth = 1. intersection = (pred * target).sum(dim=(1, 2)) union = pred.sum(dim=(1, 2)) + target.sum(dim=(1, 2)) return 1 - ((2. * intersection + smooth) / (union + smooth)).mean() ``` #### Focal 损失函数 (Focal Loss) 为了应对极端类别不平衡的问题而提出的改进版交叉熵损失——Focal Loss引入了一个调节因子γ来降低容易分错的负样本权重,使得模型更加关注难以区分的例子。这有助于提高少数类别的检测精度而不牺牲整体性能。 ```python class FocalLoss(nn.Module): def __init__(self, gamma=2., alpha=None): super(FocalLoss, self).__init__() self.gamma = gamma self.alpha = alpha def forward(self, input, target): ce_loss = F.cross_entropy(input, target, reduction='none') pt = torch.exp(-ce_loss) focal_loss = (self.alpha * (1-pt)**self.gamma * ce_loss).mean() return focal_loss ``` #### Tversky 损失函数 (Tversky Loss) 作为Dice损失的一种泛化形式,Tversky增加了β参数控制正负样本间的重要性平衡。当设置不同的α和β值可以灵活调整对不同类型的错误惩罚程度,因此非常适合解决不对称的数据分布情况下的优化难题。 ```python def tversky_loss(pred, target, beta=0.7): smooth = 1e-5 tp = (pred * target).sum((1, 2)) fp = ((1-target)*pred).sum((1, 2)) fn = (target*(1-pred)).sum((1, 2)) score = (tp + smooth)/(tp + beta*fn + (1-beta)*fp + smooth) return 1-score.mean() ``` #### Lovász-Softmax 损失函数 (Lovász-Softmax Loss) 不同于其他逐像素独立评估的方法,Lovász Softmax考虑到了整个区域内的误差累积效应,并将其转化为连续可导的形式以便于BP算法求解最优解路径。这种方法能更好地捕捉到物体边界信息并减少过拟合风险。 ```python from lovasz_losses import lovasz_softmax lovasz_criterion = lambda logits, labels: lovasz_softmax(logits.softmax(dim=1), labels, classes='present', per_image=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值