有哪些「魔改」损失函数,曾经拯救了你的深度学习模型?

知乎高质量回答

一、作者:张良怀

https://www.zhihu.com/question/294635686/answer/606259229
本文来自知乎问答,回答已获作者授权,禁止二次转载

我来谈谈分割任务的Loss函数。

首先想要解释一下,Loss函数的目的是为了评估网络输出和你想要的输出(Ground Truth,GT)的匹配程度。我们不应该把Loss函数限定在Cross-Entropy和他的一些改进上面,应该更发散思维,只要满足两点:

(1)能够表示网络输出和待分割目标的相似程度

(2)Loss的计算过程是可导的,可以进行误差反传

仍然从Cross-Entropy和它的一些改进说起,这一类Loss函数可以叫做Pixel-Level的Loss,因为他们都是把分割问题看做对每个点的分类,这一类包括:

1.CE(cross-entropy)。

2.wCE(weighted cross-entropy)。可以看UNet原论文,对边界像素这些难学习的像素加大权重(pixel-weight);当然还可以做类层面的加权(class-weight),比如对前景像素加大权重,背景像素减小权重,或者不同的类别按照其所占像素的比例,分配权重,占比小的权重大一些,占比大的权重小一些,解决样本不平衡的问题。

3.focal loss。很巧妙又简洁的一种方式。它使难分类样本权重大,易分类样本权重小。至于哪些是难分类样本哪些是易分类样本,都由网络的输出和真实的偏差决定。这就实现了网络自适应调整。类比我们学知识,难学习的内容,我们同样时间学的不好自己知道,我就会自觉的花更多精力去学习。以前的神经网络没有识别难易任务自动分配精力的方式,focal loss带来了这种自适应反馈。同样能够实现这种自适应方式的还有在线难样本挖掘(Online Hard Example Mining,OHEM)。

2016年的VNet论文首次提出了Dice Loss,应该是Class-Level的Loss的代表。

Dice系数是分割效果的一个评判指标,其公式相当于预测结果区域和ground truth区域的交并比,所以它是把一个类别的所有像素作为一个整体去计算Loss的。因为Dice Loss直接把分割效果评估指标作为Loss去监督网络,不绕弯子,而且计算交并比时还忽略了大量背景像素,解决了正负样本不均衡的问题,所以收敛速度很快。

类似的Loss函数还有IoU Loss。

如果说DiceLoss是一种区域面积匹配度去监督网络学习目标的话,那么我们也可以使用边界匹配度去监督网络的Boundary Loss。我们只对边界上的像素进行评估,和GT的边界吻合则为0,不吻合的点,根据其距离边界的距离评估它的Loss。这一类论文可以搜关键词Boundary aware,Boundary Loss等。

不管是逐像素、区域,还是边界,它们都是低维特征,我们还可以考虑使用预测结果和GT的高维特征的匹配度去监督网络,高维特征即Mask的一些形状特征,这样的监督方式就能够让网络学会去学习目标结构的形状先验(Shape Prior)。如何提取高维特征,有的论文使用PCA对输出和GT进行降维,也有使用自编码器(AutoEncoder)的Encoder端进行编码的(需先使用Mask训练一个自编码器),然后对降维后的编码计算距离,作为最终的Loss。这一类论文可以搜关键词Shape Prior,Shape Constrained...,Anatomically Constrained等等。

以上所有的Loss都是用Mask去监督网络的输出,如果我们的Mask标注的并不够好呢,我们是不是可以考虑引入一些原图的信息作为辅助,丰富Loss函数,监督网络,这种思路叫做Weakly-supervise/Semi-supervise,弱监督。

上述大多都是结合自己的工作和文献阅读的总结。如果有不恰当的地方,欢迎交流讨论。

二、作者:Hanson

https://www.zhihu.com/question/294635686/answer/595838074
本文仅用于学术分享,著作权归作者所有。

我在做缺陷检测时候对比了一些loss的性能,其实确实是那句话,适合自己的才是最好的。以下我用实际例子来说明这个问题

实验条件

为了实验方便,我们使用了CrackForest数据集,https://github.com/cuilimeng/CrackForest-dataset做训练测试,目的是去将裂纹缺陷分割出来,总共118张图片,其中训练样本94张,测试样本24张,采用旋转、随机缩放、裁剪、图像亮度增强、随机翻转增强操作,保证实验参数一直,模型均是类Unet网络,仅仅使用了depthwise卷积结构,进行了如下几组实验,并在tensorboard中进行图像预测状态的观测

CrackForest数据集samples

weighted CrossEntropy

在loss函数的选取时,类似focal loss,常规可以尝试使用cross_entropy_loss_RCF,https://github.com/meteorshowers/RCF-pytorch/blob/master/functions.py,或者是weighted MSE,因为图像大部分像素为非缺陷区域,只有少部分像素为缺陷裂痕,这样可以方便解决样本分布不均匀的问题

validation
epoch[625] | val_loss: 2708.3965 | precisions: 0.2113 | recalls: 0.9663 | f1_scores: 0.3467
training
2018-11-27 11:53:56 [625-0] | train_loss: 2128.9360 | precisions: 0.2554 | recalls: 0.9223 | f1_scores: 0.4000
2018-11-27 11:54:13 [631-2] | train_loss: 1416.9917 | precisions: 0.2359 | recalls: 0.9541 | f1_scores: 0.3782
2018-11-27 11:54:31 [637-4] | train_loss: 1379.9745 | precisions: 0.1916 | recalls: 0.9591 | f1_scores: 0.3194
2018-11-27 11:54:50 [643-6] | train_loss: 1634.6824 | precisions: 0.3067 | recalls: 0.9636 | f1_scores: 0.4654
2018-11-27 11:55:10 [650-0] | train_loss: 2291.4810 | precisions: 0.2498 | recalls: 0.9317 | f1_scores: 0.3940

weighted CrossEntropy loss的最佳预测结果

weighted CrossEntropy 在实验过程中因为图片中的缺陷部分太过稀疏,导致了weights的选取有很大的问题存在,训练后会发现其recall极高,但是precision却也是很低,loss曲线也极其不规律,基本是没法参考的,能把很多疑似缺陷的地方给弄进来.因此只能将weights改为固定常量,这样可以在一定程度上控制均衡recall和precision,但调参也会相应变得麻烦

MSE(不带权重)

我们先来试试MSE,在分割上最常规的loss

validation
epoch[687] | val_loss: 0.0063 | precisions: 0.6902 | recalls: 0.6552 | f1_scores: 0.6723 | time: 0
epoch[875] | val_loss: 0.0067 | precisions: 0.6324 | recalls: 0.7152 | f1_scores: 0.6713 | time: 0
epoch[1250] | val_loss: 0.0066 | precisions: 0.6435 | recalls: 0.7230 | f1_scores: 0.6809 | time: 0
epoch[1062] | val_loss: 0.0062 | precisions: 0.6749 | recalls: 0.6835 | f1_scores: 0.6792 | time: 0
training
2018-11-27 15:01:34 [1375-0] | train_loss: 0.0055 | precisions: 0.6867 | recalls: 0.6404 | f1_scores: 0.6627
2018-11-27 15:01:46 [1381-2] | train_loss: 0.0045 | precisions: 0.7223 | recalls: 0.6747 | f1_scores: 0.6977
2018-11-27 15:01:58 [1387-4] | train_loss: 0.0050 | precisions: 0.7336 | recalls: 0.7185 | f1_scores: 0.7259
2018-11-27 15:02:09 [1393-6] | train_loss: 0.0058 | precisions: 0.6719 | recalls: 0.6196 | f1_scores: 0.6447
2018-11-27 15:02:21 [1400-0] | train_loss: 0.0049 | precisions: 0.7546 | recalls: 0.7191 | f1_scores: 0.7364
2018-11-27 15:02:32 [1406-2] | train_loss: 0.0057 | precisions: 0.7286 | recalls: 0.6919 | f1_scores: 0.7098
2018-11-27 15:02:42 [1412-4] | train_loss: 0.0054 | precisions: 0.7850 | recalls: 0.6932 | f1_scores: 0.7363
2018-11-27 15:02:53 [1418-6] | train_loss: 0.0050 | precisions: 0.7401 | recalls: 0.7223 | f1_scores: 0.7311

MSE loss的最佳预测结果

MSE在训练上较cross entropy就比较稳定,在heatmap预测上优势挺明显

weighted MSE(8:1)

既然MSE的效果还不错,那么是否加权后就更好了呢,其实从我做的实验效果来看,并不准确,没想象的那么好,甚至导致性能下降了

validation
epoch[2000] | val_loss: 11002.3584 | precisions: 0.5730 | recalls: 0.7602 | f1_scores: 0.6535 | time: 1
training
2018-11-27 13:12:44 [2000-0] | train_loss: 7328.5186 | precisions: 0.6203 | recalls: 0.6857 | f1_scores: 0.6514
2018-11-27 13:13:01 [2006-2] | train_loss: 6290.4971 | precisions: 0.5446 | recalls: 0.5346 | f1_scores: 0.5396
2018-11-27 13:13:18 [2012-4] | train_loss: 5887.3525 | precisions: 0.6795 | recalls: 0.6064 | f1_scores: 0.6409
2018-11-27 13:13:36 [2018-6] | train_loss: 6102.1934 | precisions: 0.6613 | recalls: 0.6107 | f1_scores: 0.6350
2018-11-27 13:13:53 [2025-0] | train_loss: 7460.8853 | precisions: 0.6225 | recalls: 0.7137 | f1_scores: 0.6650

weighted MSE loss的最佳预测结果

以上loss在性能表现上,MSE > weighted MSE > weighted CrossEntropy,最简单的却在该任务上取得了最好的效果,所以我们接下来该做的,就是去怀疑人生了!

觉得有用麻烦给个在看啦~  

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于语义分割任务,常用的损失函数是交叉熵损失函数。然而,使用传统的交叉熵损失函数存在一些问题,如类别不平衡和边界模糊等。因此,有一些改进的方法可以提高语义分割的精度和性能。 1. 权重交叉熵损失函数(Weighted Cross Entropy Loss):通过赋予不同类别的像素不同的权重,可以解决类别不平衡问题。通常,权重可以根据每个类别在训练集中的频率进行计算,使得少数类别的像素有更大的权重。 2. 评估指标损失函数(IoU Loss):交叉熵损失函数只关注像素级别的分类准确性,而忽略了目标物体的边界准确性。为了解决这个问题,可以使用评估指标损失函数(如Intersection over Union,简称IoU)来度量预测结果和真实标签之间的重叠程度。通过最大化IoU值,可以提高边界的精度。 3. 多尺度损失函数(Multi-scale Loss):语义分割任务通常需要同时考虑局部和全局信息。为了综合考虑不同尺度上的特征,可以设计多尺度损失函数。一种常见的方法是使用多个尺度的预测结果,并分别计算它们的损失函数,然后将损失函数进行加权求和。 4. 上下文注意力损失函数(Context Attention Loss):为了提高语义分割的精度,可以引入上下文信息。一种常见的方法是使用注意力机制,将图像的上下文信息融合到特征表示中。通过设计上下文注意力损失函数,可以引导模型更好地利用上下文信息进行语义分割。 这些改进的损失函数可以结合使用,也可以根据具体任务的特点选择适合的方法。同时,还可以通过数据增强、模型结构优化等其他方法进一步提高语义分割的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值