Deep learning 如何从Pytork中的概率计算交叉熵?

Deep learning 如何从Pytork中的概率计算交叉熵?,deep-learning,pytorch,loss-function,cross-entropy,Deep Learning,Pytorch,Loss Function,Cross Entropy,默认情况下,PyTorch的交叉熵将logits(模型的原始输出)作为输入。我知道CrossEntropyLoss将LogSoftmax(log(softmax(x)))和NLLLoss(负对数似然损失)组合在一个单独的类别中。所以,我想我可以使用NLLLoss从概率中得到交叉熵损失,如下所示: 真实标签:[1,0,1] 遗嘱认证:[0.1,0.9],[0.9,0.1],[0.2,0.8] 其中,y_i,j表示真实值,即如果样本i属于类j则为1,否则为0。 而p_i,j表示样本i属于类j的模型

默认情况下,PyTorch的
交叉熵
将logits(模型的原始输出)作为输入。我知道
CrossEntropyLoss
LogSoftmax
(log(softmax(x)))和
NLLLoss
(负对数似然损失)组合在一个单独的类别中。所以,我想我可以使用
NLLLoss
从概率中得到交叉熵损失,如下所示:

真实标签:[1,0,1]
遗嘱认证:[0.1,0.9],[0.9,0.1],[0.2,0.8]

其中,
y_i,j
表示真实值,即如果样本
i
属于类
j
则为1,否则为0。 而
p_i,j
表示样本
i
属于类
j
的模型预测的概率

如果我手工计算,结果是:

>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338
使用Pytork:

>>> labels = torch.tensor([1, 0, 1], dtype=torch.long)
>>> probs = torch.tensor([[0.1, 0.9], [0.9, 0.1], [0.2, 0.8]], dtype=torch.float)
>>> F.nll_loss(torch.log(probs), labels)
tensor(0.1446)

我做错了什么?为什么答案不同?

PyTorch中的所有损耗函数都有一个缩减参数。正如您可以从中看到的,默认的缩减参数是“mean”,它将总和除以批次中的元素数。要获得所需的求和行为(0.4338),应按如下所示给出缩减参数:

F.nll_loss(torch.log(probs), labels,reduction='sum')