softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()
Posted LeoJarvis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()相关的知识,希望对你有一定的参考价值。
我们在处理单标签多分类问题时,若考虑用softmax来对模型最后输出作计算以得到各标签的概率分布,那之后可以通过crossentropy做一个似然估计,求得误差
但softmax求出来的概率分布中,每个标签的概率p∈(0,1),当有些标签的概率过小时就会导致下溢出(实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出。此时如果对这个数再做某些运算(例如除以它)就会出问题。)。
考虑softmax和crossentropy这个组合方案,crossentropy的计算是在概率分布外面套一个log 来似然,也就是做Log(Softmax(x))这个一个工作。那么直接在计算概率分布的时候加上log,把概率从(0,1)变为(-∞,0),这样就可以防止中间的计算中出现下溢出。 所以log_softmax说白了就是将本来应该由crossentropy做的套log的工作提前到预测概率分布这里来,跳过了中间的存储步骤,防止中间数值会有下溢出,使得数据更加稳定。
正是由于把log这一步从计算误差提到前面,所以用log_softmax之后就可以直接用NLLLoss来计算误差(它没有套log这一步,直接将输入取反,然后计算和label的乘积求和平均)。
在实践过程中出现了这段报错
nn.CrossentropyLoss(predictions, labels)
RuntimeError: Boolean value of Tensor with more than one value is ambiguous
虽然不知道什么原因,但只要改成这样就好了
riterion = nn.CrossEntropyLoss()
criterion(predictions, labels)
以上是关于softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()的主要内容,如果未能解决你的问题,请参考以下文章
softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()
softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()
pytorch CrossEntropyLoss(), Softmax(), logSoftmax, NLLLoss
pytorch中BCEWithLogitsLoss&CrossEntropyLoss函数
在使用 Keras categorical_crossentropy loss 时,是不是应该在最后一层使用 softmax?