pytorch中BCEWithLogitsLoss&CrossEntropyLoss函数

先说结论:

BCEWithLogitsLoss函数包括了 Sigmoid 层和 BCELoss 层. 适用于多标签分类任务

CrossEntropyLoss函数 包含Softmax,层和 NLLLoss层,适用于单标签分类问题

对Sigmoid和Softmax函数不熟悉的可以看上一篇文章:https://www.jianshu.com/p/b13f4f419cce

再来看两个函数的具体计算过程,也是对交叉熵损失函数的一个复习过程.

1. BCEWithLogitsLoss函数:

先对输出向量里的每个元素使用sigmoid函数, 然后使用BCELoss函数
具体例子如下:

在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵。每行代表每一张图片的模型输出向量.

先用Sigmoid给这些值都搞到0~1之间:

假设Target是:(sigmoid用来处理多标签分类问题,这里也可以看出来)

BCELOSS的计算过程如下

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步

2. CrossEntropyLoss函数:

在图片单标签分类时,输入m张图片,输出一个mN的Tensor,其中N是分类个数。比如输入3张图片,分三类,最后的输出是一个33的Tensor,举个例子:

第1,2,3行分别是第1,2,3张图片的结果,假设第1,2,3列分别是猫、狗和猪的分类得分。 可以看出模型认为第1,2,3张都更可能是猫。然后对每一行使用Softmax,这样可以得到每张图片的概率分布。

这里dim的意思是计算Softmax的维度,这里设置dim=1,可以看到每一行的加和为1。比如第一行0.6600+0.0570+0.2830=1。我们这里一张图片是一行,所以dim应该设置为1。

然后对Softmax的结果取自然对数:

Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。假设我们现在Target是[0,2,1](第一张图片是猫,第二张是猪,第三张是狗)。第一行取第0个元素,第二行取第2个,第三行取第1个,去掉负号,结果是:[0.4155,1.0945,1.5285]。再求个均值,结果是:

CrossEntropyLoss就是把以上Softmax–Log–NLLLoss合并成一步,我们用刚刚随机出来的input直接验证一下结果是不是1.0128:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 酒逢知己千杯少,更何况是多年没见的好明友?没有多少时间,20个罐子空空如也。 我去前台要了1瓶白酒,2瓶红酒,结果...
    浮东流阅读 61评论 0 1
  • 姓名:庹亚军 公司:宁波贞观电器有限公司 组别:第235期 利他一组 【日精进打卡第 409天】 【知~学习】 看...
    tyj小电工阅读 188评论 0 0
  • 时间过得很快,转眼来吉隆坡工作已经一周了。更快的是,加入007 52班也已经一年了。 遗憾的是,这一年自己并没有太...
    王得全阅读 1,459评论 0 0
  • 眼看着近中午一点了,思索了半天,还是不知道吃什么,越来越发现这好像也是一种病,一种叫各种纠结的病。 坐在沙发上硬拖...
    韩若离阅读 335评论 0 0