为何使用PyTorch的cross_entropy得到错误计算结果?
问题原因解析
你犯了一个关键误解:PyTorch的F.cross_entropy输入的是未经过softmax的logit张量,而非softmax后的概率值,它会自动完成「softmax → 取对数 → 负对数似然损失」的完整计算流程。
具体计算过程验证
你的输入logit是torch.tensor([[0.25, 0.5, 0.25]]),目标是torch.tensor([0]),PyTorch的计算步骤如下:
- 对logit做softmax计算概率:
import torch logits = torch.tensor([[0.25, 0.5, 0.25]]) probs = torch.softmax(logits, dim=1) # probs结果为tensor([[0.3045, 0.3910, 0.3045]]) - 对概率取自然对数:
log_probs = torch.log(probs) # log_probs结果为tensor([[-1.1891, -0.9416, -1.1891]]) - 计算负对数似然损失(取目标类别对应的log概率的负值):
loss = -log_probs[0][0] # loss结果为tensor(1.1891)
你的手动计算错误点
你直接把输入的logit值[0.25,0.5,0.25]当成了softmax后的概率代入公式,但实际上这只是模型输出的原始logit,并没有经过softmax归一化。如果要手动匹配PyTorch的结果,必须先对logit做softmax再计算交叉熵。
如果确实想直接用概率值计算损失,你需要使用F.nll_loss,但要先对概率取对数,并且确保输入是log概率张量:
import torch.nn.functional as F probs = torch.tensor([[0.25, 0.5, 0.25]]) log_probs = torch.log(probs) target = torch.tensor([0]) loss = F.nll_loss(log_probs, target) # loss结果为tensor(1.3863),和你手动计算的结果一致
内容的提问来源于stack exchange,提问作者reject-cookies
相关产品推荐
相关产品推荐

