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)

冀公网安备13050302001966号