我的pred是[1, 0],label是0,但是最后ce loss不为0,而是0.3133。
pytorch 社区问题
https://discuss.pytorch.org/t/a-bug-of-cross-entropy/158247
明确一下,
- nn.CrossEntropyLoss期望 logits 作为模型输出
pred = torch.tensor([10000., -10000.]) pred = pred.unsqueeze(0).expand(10, -1) label = torch.zeros(10).long() criterion = nn.CrossEntropyLoss() loss = criterion(pred, label) print(loss) # tensor(0.)
-
F.binary_cross_entropy 期望输入sigmoid之后的0-1的向量。但是因为数值精度不是很稳定,amp float16情况下使用不了。
-
F.binary_cross_entropy_with_logits 期望输入logits,但是要注意,logits不能为0,否则loss 会nan。其次amp float16 情况下,需要保持logits是float32,因为logits很容易很大很小(比如我使用了clamp(1e-7, 1-1e-7)),造成数值溢出。可以使用mmcv的@force_fp32(apply_to=(‘logits’, )) 来保证。
在我案例下,@force_fp32(apply_to=(‘logits’, ))可以防止nan,但是训练阶段总还会遇到偶尔的 nan,最后我加了logits.float().clamp(1e-7, 1-1e-7),loss就再也没有nan了



