使用PyTorch计算交叉熵损失时结果不符预期,求原因解析
PyTorch交叉熵损失计算异常原因解析
你的问题核心是没搞懂PyTorch中CrossEntropyLoss的计算逻辑:
CrossEntropyLoss默认把输入当作未经过softmax的logits,它会自动先对输入做softmax运算,再计算交叉熵损失。- 你的输入是
torch.tensor([[1.,0.0,0.0],[1.,0.0,0.0]]),先对每个样本做softmax:
以第一个样本为例,softmax计算为:
对应的交叉熵损失是softmax(1) = e^1 / (e^1 + e^0 + e^0) ≈ 2.718 / (2.718 + 1 + 1) ≈ 0.5761-ln(0.5761) ≈ 0.5514,两个样本结果相同,默认取平均后最终损失就是0.5514。
如果你的输入已经是经过softmax的概率值,想要得到预期的0损失,有两种解决方式:
- 方式一:使用
NLLLoss,但需要先对输入取自然对数(注意避免log(0)的情况):import torch import torch.nn as nn input_probs = torch.tensor([[1.,0.0,0.0],[1.,0.0,0.0]]) labels = torch.tensor([0, 0]) log_probs = torch.log(input_probs) loss_fn = nn.NLLLoss() loss = loss_fn(log_probs, labels) - 方式二:如果输入是logits,想要让损失为0,需要让正确类别的logits远大于其他类别,比如把输入改成
torch.tensor([[100.,0.0,0.0],[100.,0.0,0.0]]),此时softmax后正确类别的概率趋近于1,交叉熵损失趋近于0。
内容的提问来源于stack exchange,提问作者Sukesh Ram
相关产品推荐
相关产品推荐

