【发布时间】:2020-05-26 17:13:06
【问题描述】:
默认情况下,PyTorch 的 cross_entropy 将 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
使用 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)
我做错了什么?为什么答案不一样?
【问题讨论】:
标签: deep-learning pytorch loss-function cross-entropy