知乎高质量回答

一、作者:张良怀

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. 「物联网架构」MQTT 传感器数据流异常检测的深度学习KSQL UDF

    用于传感器分析的KSQL UDF.利用KSQL的新的API特性,用Java轻松地构建UDF / UDAF函数,从而使用Apache Kafka进行连续流处理.用例:联网汽车--使用深度学习的实时流媒体 ...

  2. 「完结」你对深度学习模型的理解是否足够深刻,这12篇文章了解下

    2020-05-28 18:07:49 文/编辑 | 言有三 好的模型结构是深度学习成功的关键因素之一,不仅是非常重要的学术研究方向,在工业界实践中也是模型是否能上线的关键.对各类底层深度学习模型设计 ...

  3. 「DLP-KDD 2021征文」及上届论文全集,包含深度学习推荐/广告系统、多目标、模型服务等

    「DLP-KDD 2021征文」及上届论文全集,包含深度学习推荐/广告系统.多目标.模型服务等 在DLP-KDD 2021征稿之际,为大家准备了DLP-KDD2020的全部文章和资源列表,内容涵盖了几 ...

  4. 自然语言处理模型_ICLR 2020 「自然语言处理」【Prosus AI】金融情感分析FinBERT模型(含源码)!...

    来源:AINLPer微信公众号 编辑: ShuYini 校稿: ShuYini 时间: 2020-1-15 TILE: FinBERT: Financial Sentiment Analysis wi ...

  5. Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」...

    原文来源:arXiv 作者:Alex Lamb.Jonathan Binas.Anirudh Goyal.Dmitriy Serdyuk.Sandeep Subramanian.Ioannis Mit ...

  6. Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」

    原文来源:arXiv 作者:Alex Lamb.Jonathan Binas.Anirudh Goyal.Dmitriy Serdyuk.Sandeep Subramanian.Ioannis Mit ...

  7. Tutorial教程:知错就改,错了就罚,论训练深度学习如何选择损失函数

    Tutorial教程:训练深度学习如何选择损失函数 xingbod@gmail.com 声明:本文为CSDN首发,谢绝转载,商业转载请联系笔者MrCharles本人获取同意 作为优化算法的一部分,必须 ...

  8. c++ log函数_认识这19种深度学习损失函数,才能说你了解深度学习!

    编辑:深度学习自然语言处理小编zenRRan 损失函数是深度学习中重要的概念,选择合适的损失函数是系统能够得到理想结果的保证,本文将以pytorch工具为例,介绍这19中损失函数与实现方法. 19种损 ...

  9. 深度学习中的损失函数如何画图_如何用深度学习来做检索:度量学习中关于排序损失函数的综述(1)...

    作者:Ahmed Taha 编译:ronghuaiyang 原文链接: https://mp.weixin.qq.com/s/LC4ch4O2eUjgbMLH9zT0pw​mp.weixin.qq.c ...

最新文章

  1. 搜索引擎的时效性需求满足
  2. 目标检测:NMS和计算mAP时的置信度阈值和IoU阈值
  3. java2第九章的总结_java并发的艺术-读书笔记-第九章线程池
  4. 计算机网络-思维导图(3)数据链路层
  5. mybatis默认的数据源连接池(PooledDataSource和UnPooledDataSource)
  6. php复制xml文件,PHP_php xml文件操作实现代码(二),复制代码 代码如下:?php //创 - phpStudy...
  7. 神奇的x -x,Lowbit函数的实现方式!
  8. SQL中多表查询:左连接、右连接、内连接、全连接、交叉连接
  9. mysql 建表语句示例_MySQL Create Table语句和示例
  10. 简单理解L0、L1与L2范数
  11. postgresql mysql数据类型_PostgreSQL和mysql数据类型对比兼容
  12. AR/VR learning (2)--unity3D在android 上的手势识别与检测
  13. Vue-条件判断与循环遍历
  14. 通过Kettle工具解析Json接口数据并且保存到数据库中的详细操作
  15. 明星分分合合的洪荒点击量,微博Mesh服务化改造如何支撑?(附PPT下载)
  16. 中国十六烷基磷酸钾行业市场供需与战略研究报告
  17. [操作系统] elementary os系统美化插件
  18. 本周(12.23-12.29)半价电子书 1
  19. 重磅!朱松纯加入北京大学,此前曾传拟加入清华
  20. NPAPI 为什么会被 Chrome 禁用

热门文章

  1. 【怎样写代码】确保对象的唯一性 -- 单例模式(三):单例模式
  2. 《C#精彩实例教程》小组阅读02 – Visual Studio简介与安装
  3. Matlab与线性代数 -- 对数化间隔向量
  4. StaticFactoryMethod_Level4
  5. tensorflow生成对抗网络
  6. 图像遍历反色处理,遍历多通道图片
  7. Python 捕获警告
  8. 再见,Python!
  9. 限免!百名AI大咖,20大技术和行业论坛,不可错过的开发者嘉年华
  10. 我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...