PyTorch 中提供了 BCELoss 和 BCEWithLogitsLoss 两个用于计算二分类交叉熵损失的函数。两者的区别如下:
- BCELoss 要求输入的 logits 必须在 (0-1) 之间,所以需要先进行 sigmoid 计算,然后再计算每个标签对应的 logit 的负对数损失,并取均值;
- BCEWithLogitsLoss 和 BCELoss 计算过程一致,仅仅是把 sigmoid 计算添加了计算公式中,无需像 BCELoss 单独计算。

import torch import torch.nn as nn def test(): # 二分类损失计算, 一个分数对应一个标签[0 或者 1] y_pred = torch.tensor([0.5, 0.3]) y_true = torch.tensor([0.0, 1.0]) # 2.1 BCELoss 使用 # 注意: BCELoss 需要预测的分数在 (0, 1) 之间, 所以需要先 Sigmoid # 2.1.1 先对预测的分数使用 sigmoid 函数激活 y_pred_sigmoid = nn.Sigmoid()(y_pred) # 2.1.2 对 sogmoid 结果计算多个样本平均损失 loss = nn.BCELoss()(y_pred_sigmoid, y_true) print(loss) # 2.2 BCEWithLogitsLoss 使用 # 注意: nn.BCEWithLogitsLoss 相当于 Simoid + BCELoss loss = nn.BCEWithLogitsLoss()(y_pred, y_true) print(loss) if __name__ == '__main__': test()
程序输出结果:
tensor([0.7109, 0.5744]) tensor(0.8978) tensor(0.8978)