最详细的语义分割---07交叉熵到底在干什么?

目前深度学习中基本都会用到交叉熵作为损失函数,那么为什么不使用别的函数作为损失函数,而要选择交叉熵呢?多类的交叉熵到底该如何计算?

什么是熵? 在信息论中,熵其实就是衡量信息量的一个指标。一个事物它发生的概率越大,那么它携带的信息就越低。例如太阳从西边出来,这个事情发生的概率是很低的,所以它携带的信息量很大。
如果我们想用数学公式表达上述现象,那么我就要找到一个函数,输入是概率,输出是它的信息量,而且概率越大的时候,信息量应该越小,概率越小,信息量越大。所以香农就找到了log函数来定义信息量(可以回忆一下log函数的曲线):

在这里插入图片描述
由于熵有非负的性质,所以这个前面是有负号的。p(x)是x发生的概率。

交叉熵

对于交叉熵,是用来衡量两个概率分布p(x)和q(x)
在这里插入图片描述
拿语义分割中的例子来说,p(x)就是真实的标签值,q(x)就是网络预测的标签值,我们既然选取交叉熵作为损失函数,那么就希望它能够约束网络是预测值和标签值非常接近。
假设预测的结果概率很小(说明网络和实际偏差很大,需要加大力度调整权值),就是式子中q(x)很小,那么通过log函数再加符号(这里为什么加负号,因为熵的非负性),那么这个损失函数就会输出较大的值,就拿这个大的参数去调整权值。如果预测结果概率很大,那么说明预测值和标签值十分接近,就只需要用较小的力度去微调网络的权值。

二值交叉熵

二值交叉熵用于区分某个目标的分类是否正确,一般用sigmoid作为损失函数。因为只用区分两个类别,是和否,所以这两个类别加起来的概率要等于1.
在这里插入图片描述
上面是二值交叉熵的计算公式p*为标签,p为预测值。那上面例子来讲,当标签为1,网络预测结果为0.9的时候,后面的哪一项就没有了,只计算了:
( -1)*log(0.9)
至于为什么有负号,那是交叉熵的非负性。当你的标签无论是1还是0,带进去会发现,二值交叉熵只会有一个式子起作用。

多分类语义分割如何计算交叉熵?

对于普通的二分类,知道了交叉熵的公式计算和理解起来都比较简单,但是对于多类别的交叉熵在程序中应该如何计算,相比不是很好理解。

我们以VOC的例子进行举例。VOC数据集有二十一个类别,语义分割中网络最后会输出二十一张特征图,每张特征图代表着每个像素点是否属于该类别的概率。而我们标签只有单通道,上面的每个像素点的值是这个像素点的类别,例如某个位置像素点为3,就说明这个像素点属于第三类。
有了这个条件我们就能够计算整个图像的与真实标签的交叉熵。

对于21张预测图像中的像素点,计算交叉熵并不会全部都用上,只会选取其中的一部分。例如,假设标签上第一个像素点上的标签为7,计算交叉熵时,就会只对应第七张预测特征图上的第一个像素点。**也就是说,交叉熵的计算只是把标签作为索引值,去索引对应的特征图,然后找到特征图上相应位置的像素值,作为网络预测的概率值。**这也就是为什么当计算交叉熵时,你填写的类别数与数据集的类别数不相等时会爆出标签越界的错误。对与交叉熵的计算方式的理解,其实你还可以看成是把标签图进行one-hot编码,然后去预测特征图上去找对应位置的像素点。通过将标签对应所有像素点的交叉熵的值计算出来,然后求平均就可以得到该张图像的交叉熵。

知道了计算原理,还有两个问题

在这里插入图片描述
即这个公式q(x)是什么和p(x)是什么。q(x)就是网络预测第n张特征图上的像素点属于该类别的概率,既然是概率,当然是小于0到1的,所以这里需要有softmax在通道数求概率(至于为什么在通道维度,因为通道代表着不同的类别)。p(x)是标签,那么这个标签是真实标签图像上面的值吗,答案不是。这个标签值应该是1,因为前面讲了,我们是那这个标签去索引对应位置的像素点,然后计算交叉熵,既然索引到了就说明这个标签是真实的,有效的(感觉这里有one-hot编码的思想好理解一点)。

要是这里还不明白,可以再看一下pytorch官方实现的公式:
在这里插入图片描述
这里就是log函数加softmax函数,至于为啥是负,前面已经讲过了。我们先只看第二项,这里class就是标签,x就是网络输出的n张特征图,从公式可以看到,分母就是把输入x进行求指数,分子就是把x[class]的球指数,合一起就是softmax,最后log。x[class]找到对应位置的值,就是一个索引操作。对于第三项,就是利用log函数性质进行了一下化简,分数变减法了。

在这里插入图片描述

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值