极简笔记 The Lovasz-Softmax loss: A tractable surrogate for the optimization of the intersection-over-un

这篇笔记介绍了 Lovasz-Softmax 损失,这是一种针对神经网络分割任务中IoU指标优化的设计。由于Jaccard loss在连续预测时不可导,Lovasz-Softmax通过Lovasz扩展使其可导,适用于连续的预测空间。作者提供了Pytorch和TensorFlow版本的实现代码,并指出该损失函数适用于微调阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

极简笔记 The Lovasz-Softmax loss: A tractable surrogate for the optimization of the intersection-over-union measure in neural networks

本文提出一种Lovasz-Softmax loss,专门正对分割任务的评价指标IoU进行优化设计。由于本文涉及到的数学概念超出所学知识,因此本篇笔记偏向于计算过程的介绍。

记网络预测结果 y ~ \widetilde{y} y 和标注 y ∗ y^* y,IoU评价指标的计算为(又名Jaccard index):
J c ( y ∗ , y ~ ) = ∣ { y ∗ = c } ∩ { y ~ = c } ∣ ∣ { y ∗ = c } ∪ { y ~ = c } ∣ J_c(y^*,\widetilde{y})=\frac{|\{y^*=c\}\cap\{\widetilde{y}=c\}|}{|\{y^*=c\}\cup\{\widetilde{y}=c\}|} Jc(y,y )={ y=c}{ y =c}{ y=c}{ y =c}
Jaccard loss可以定义为:

Lovasz-Softmax Loss是一种用于处理多类别分割任务的损失函数,尤其适用于那些类别不平衡的数据集。它结合了传统softmax交叉熵和Jaccard相似度的思想。以下是使用PyTorch实现 Lovasz-Softmax Loss的基本代码: ```python import torch from scipy.special import softmax def lovasz_grad(gt_sorted): """ Computes gradient of the Lovasz extension w.r.t sorted errors See Alg. 1 in paper """ p = len(gt_sorted) gts = gt_sorted.sum() intersection = gts - gt_sorted.float().cumsum(0) union = gts + (1 - gt_sorted).float().cumsum(0) jaccard = 1. - intersection / union if p > 1: # cover 1-pixel case jaccard[1:] = jaccard[1:] - jaccard[:-1] return jaccard def lovasz_softmax_flat(probas, labels, classes='present', per_image=False, ignore=None): """ Multi-class Lovasz-Softmax loss probas: [B, C, H, W] Variable, class probabilities at each prediction (between 0 and 1). labels: [B, H, W] Tensor, ground truth labels (between 0 and C - 1) classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average. per_image: compute the loss per image instead of per batch ignore: void class id """ if per_image: loss = mean(lovasz_softmax_flat(probas[i], labels[i], classes, ignore=ignore) for i in range(labels.size(0))) else: losses = [] C = probas.size(1) if ignore is not None: valid = (labels != ignore) else: valid = labels >= 0 for c in range(C): fg = (labels == c) & valid if classes == 'present': fg_sum = fg.sum(dim=(1, 2)) if fg_sum.item() > 0: if classes == 'all': if ignore is not None: valid_c = (labels != (c + ignore)) & valid fg = fg & valid_c else: fg = fg[labels == c] elif c not in classes: continue if fg.any(): if permute: fg = fg[:, :, None].expand_as(probas) fg = fg.contiguous().view(-1) probas_c = probas[:, c].contiguous().view(-1) else: fg = fg.view(-1) probas_c = probas[fg, c] lab_c = labels.new_full((probas_c.numel(),), c, dtype=torch.long) lab_c = lab_c[fg] loss = lovasz_loss(probas_c, lab_c, reduce=False) losses.append(loss.view(-1, 1)) loss = sum(losses) return loss # 使用示例 probas = torch.rand(5, 10, 28, 28) labels = torch.randint(0, 9, (5, 28, 28)) loss = lovasz_softmax_flat(probas, labels) ``` 注意,这个实现需要`scipy`库来进行softmax操作,以及一些额外的计算。如果你的环境中没有安装`scipy`,可以尝试其他开源库如`pylops`提供类似的功能。同时,`permute`变量在这里被假设为True,表示是否需要对输入概率分布进行维度转换。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值