如何根据 PyTorch 中的概率计算交叉熵?
How do I calculate cross-entropy from probabilities in PyTorch?
默认情况下,PyTorch 的 cross_entropy
将 logits(模型的原始输出)作为输入。我知道 CrossEntropyLoss
在一个 class 中结合了 LogSoftmax
(log(softmax(x))) 和 NLLLoss
(负对数似然损失)。所以,我想我可以使用 NLLLoss
从概率中得到交叉熵损失,如下所示:
true labels: [1, 0, 1]
probabilites: [0.1, 0.9], [0.9, 0.1], [0.2, 0.8]
其中,y_i,j
表示真实值,即如果样本 i
属于 class j
则为 1,否则为 0。
p_i,j
表示您的样本 i
模型预测的属于 class j
.
的概率
如果我手算的话,结果是:
>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338
使用 PyTorch:
>>> 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 中的所有损失函数都有一个缩减参数。正如您从 documentation 中看到的,默认缩减参数是 'mean',它将总和除以批处理中的元素数量。要获得所需的求和行为 (0.4338),您应该按以下方式提供缩减参数:
F.nll_loss(torch.log(probs), labels,reduction='sum')
默认情况下,PyTorch 的 cross_entropy
将 logits(模型的原始输出)作为输入。我知道 CrossEntropyLoss
在一个 class 中结合了 LogSoftmax
(log(softmax(x))) 和 NLLLoss
(负对数似然损失)。所以,我想我可以使用 NLLLoss
从概率中得到交叉熵损失,如下所示:
true labels: [1, 0, 1]
probabilites: [0.1, 0.9], [0.9, 0.1], [0.2, 0.8]
其中,y_i,j
表示真实值,即如果样本 i
属于 class j
则为 1,否则为 0。
p_i,j
表示您的样本 i
模型预测的属于 class j
.
如果我手算的话,结果是:
>>> -(math.log(0.9) + math.log(0.9) + math.log(0.8))
0.4338
使用 PyTorch:
>>> 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 中的所有损失函数都有一个缩减参数。正如您从 documentation 中看到的,默认缩减参数是 'mean',它将总和除以批处理中的元素数量。要获得所需的求和行为 (0.4338),您应该按以下方式提供缩减参数:
F.nll_loss(torch.log(probs), labels,reduction='sum')