Pytorch详解NLLLoss和CrossEntropyLoss
pytorch的官方文档写的也太简陋了吧…害我看了这么久…NLLLoss在图片单标签分类时,输入m张图片,输出一个m*N的Tensor,其中N是分类个数。比如输入3张图片,分三类,最后的输出是一个3*3的Tensor,举个例子:第123行分别是第123张图片的结果,假设第123列分别是猫、狗和猪的分类得分。可以看出模型认为第123张都更可能是猫。然后对每一行使用Softmax,这样可以. 125880人浏览 · 2018-12-24 10:46:12 pytorch的官方文档写的也太简陋了吧…害我看了这么久…
NLLLoss
在图片单标签分类时,输入m张图片,输出一个m*N的Tensor,其中N是分类个数。比如输入3张图片,分三类,最后的输出是一个3*3的Tensor,举个例子:
第123行分别是第123张图片的结果,假设第123列分别是猫、狗和猪的分类得分。
可以看出模型认为第123张都更可能是猫。
然后对每一行使用Softmax,这样可以得到每张图片的概率分布。
这里dim的意思是计算Softmax的维度,这里设置dim=1,可以看到每一行的加和为1。比如第一行0.6600+0.0570+0.2830=1。
如果设置dim=0,就是一列的和为1。比如第一列0.2212+0.3050+0.4738=1。
我们这里一张图片是一行,所以dim应该设置为1。
然后对Softmax的结果取自然对数:
Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。
NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。
假设我们现在Target是[0,2,1](第一张图片是猫,第二张是猪,第三张是狗)。第一行取第0个元素,第二行取第2个,第三行取第1个,去掉负号,结果是:[0.4155,1.0945,1.5285]。再求个均值,结果是:
下面使用NLLLoss函数验证一下:
嘻嘻,果然是1.0128!
CrossEntropyLoss
CrossEntropyLoss就是把以上Softmax–Log–NLLLoss合并成一步,我们用刚刚随机出来的input直接验证一下结果是不是1.0128:
真的是1.0128.
总结
nn.CrossEntropyLoss() ————-》 其内部会自动加上Sofrmax层
nn.BCELoss() 时需要先加上一个Softmax()层
nn.NLLLoss() 交叉熵上损失 softmax+log+null = nn.CrossEntropyLoss() 已验证