查看原文
其他

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

CV开发者都爱看的 极市平台 2021-09-20

加入极市专业CV交流群,与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~

知乎高质量回答

一、作者:张良怀

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,因为图像大部分像素为非缺陷区域,只有少部分像素为缺陷裂痕,这样可以方便解决样本分布不均匀的问题

validationepoch[625] | val_loss: 2708.3965 | precisions: 0.2113 | recalls: 0.9663 | f1_scores: 0.3467training2018-11-27 11:53:56 [625-0] | train_loss: 2128.9360 | precisions: 0.2554 | recalls: 0.9223 | f1_scores: 0.40002018-11-27 11:54:13 [631-2] | train_loss: 1416.9917 | precisions: 0.2359 | recalls: 0.9541 | f1_scores: 0.37822018-11-27 11:54:31 [637-4] | train_loss: 1379.9745 | precisions: 0.1916 | recalls: 0.9591 | f1_scores: 0.31942018-11-27 11:54:50 [643-6] | train_loss: 1634.6824 | precisions: 0.3067 | recalls: 0.9636 | f1_scores: 0.46542018-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

validationepoch[687] | val_loss: 0.0063 | precisions: 0.6902 | recalls: 0.6552 | f1_scores: 0.6723 | time: 0epoch[875] | val_loss: 0.0067 | precisions: 0.6324 | recalls: 0.7152 | f1_scores: 0.6713 | time: 0epoch[1250] | val_loss: 0.0066 | precisions: 0.6435 | recalls: 0.7230 | f1_scores: 0.6809 | time: 0epoch[1062] | val_loss: 0.0062 | precisions: 0.6749 | recalls: 0.6835 | f1_scores: 0.6792 | time: 0training2018-11-27 15:01:34 [1375-0] | train_loss: 0.0055 | precisions: 0.6867 | recalls: 0.6404 | f1_scores: 0.66272018-11-27 15:01:46 [1381-2] | train_loss: 0.0045 | precisions: 0.7223 | recalls: 0.6747 | f1_scores: 0.69772018-11-27 15:01:58 [1387-4] | train_loss: 0.0050 | precisions: 0.7336 | recalls: 0.7185 | f1_scores: 0.72592018-11-27 15:02:09 [1393-6] | train_loss: 0.0058 | precisions: 0.6719 | recalls: 0.6196 | f1_scores: 0.64472018-11-27 15:02:21 [1400-0] | train_loss: 0.0049 | precisions: 0.7546 | recalls: 0.7191 | f1_scores: 0.73642018-11-27 15:02:32 [1406-2] | train_loss: 0.0057 | precisions: 0.7286 | recalls: 0.6919 | f1_scores: 0.70982018-11-27 15:02:42 [1412-4] | train_loss: 0.0054 | precisions: 0.7850 | recalls: 0.6932 | f1_scores: 0.73632018-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的效果还不错,那么是否加权后就更好了呢,其实从我做的实验效果来看,并不准确,没想象的那么好,甚至导致性能下降了

validationepoch[2000] | val_loss: 11002.3584 | precisions: 0.5730 | recalls: 0.7602 | f1_scores: 0.6535 | time: 1training2018-11-27 13:12:44 [2000-0] | train_loss: 7328.5186 | precisions: 0.6203 | recalls: 0.6857 | f1_scores: 0.65142018-11-27 13:13:01 [2006-2] | train_loss: 6290.4971 | precisions: 0.5446 | recalls: 0.5346 | f1_scores: 0.53962018-11-27 13:13:18 [2012-4] | train_loss: 5887.3525 | precisions: 0.6795 | recalls: 0.6064 | f1_scores: 0.64092018-11-27 13:13:36 [2018-6] | train_loss: 6102.1934 | precisions: 0.6613 | recalls: 0.6107 | f1_scores: 0.63502018-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,最简单的却在该任务上取得了最好的效果,所以我们接下来该做的,就是去怀疑人生了!

推荐阅读




    添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入极市技术交流群,更有每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、行业技术交流一起来让思想之光照的更远吧~


    △长按添加极市小助手


    △长按关注极市平台,获取最新CV干货


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

    : . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存