当我在PyTorch中构建分类器时,我有两个选项可以进行
- 在不修改模型的情况下使用
nn.CrossEntropyLoss
- 使用添加了
F.log_softmax
的nn.NNLLoss
作为模型中的最后一层
所以有两种方法。
现在,任何人都应该使用什么方法,为什么?
它们是一样的。
如果检查实现,您会发现它在对传入参数应用log_softmax
之后调用nll_loss
。
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
Edit:看起来链接现在断了,下面是显示相同信息的C++实现。
交叉熵和对数似然都是对同一公式的两种不同解释。在对数似然的情况下,我们最大化正确类的概率(实际似然(,这与最小化交叉熵相同。虽然你是对的,但这两个都在文献中造成了一些歧义,然而,也有一些微妙之处和注意事项,我强烈建议你仔细阅读这篇文章,因为这个话题已经在那里进行了严格的讨论。你可能会发现它很有用。
输出层中的交叉熵或对数似然