先说结论:
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: