什么是 BCELoss?
BCELoss,即二元交叉熵损失,是用于二分类问题的损失函数。它的基本思想是计算预测概率分布与真实标签之间的交叉熵。交叉熵越小,表示模型的预测越接近真实标签。
数学表达式
对于单个样本,BCELoss 的数学表达式如下:
BCELoss 在 PyTorch 中的实现
在 PyTorch 中,提供了 BCELoss(二元交叉熵损失)的接口,BCELoss 的实现非常简单。示例代码如下:
导入torch
import torch
生成2个4*4大小的Tensor,用变量a,b接收,生成一个4*4的target,用变量c接收
a=torch.rand(4,4,requires_grad=True)
b=torch.randn(4,4,requires_grad=True)
c=torch.randint(0,2,(4,4)).float()
a返回结果如下,每个元素的 范围是0到1
tensor([[0.7576, 0.2793, 0.4031, 0.7347],
[0.0293, 0.7999, 0.3971, 0.7544],
[0.5695, 0.4388, 0.6387, 0.5247],
[0.6826, 0.3051, 0.4635, 0.4550]], requires_grad=True)
b返回结果如下,每个元素的 范围是 -∞到+∞
tensor([[-0.6970, -1.1608, 0.6995, 0.1991],
[ 0.8657, 0.2444, -0.6629, 0.8073],
[ 1.1017, -0.1759, -2.2456, -1.4465],
[ 0.0612, -0.6177, -0.7981, -0.1316]], requires_grad=True)
c返回结果如下,每个元素为0或1
tensor([[1., 1., 1., 1.],
[1., 0., 0., 0.],
[1., 1., 1., 1.],
[1., 1., 0., 1.]])
计算a,c的Loss,可直接调用 torch.nn.BCELoss()
torch.nn.BCELoss()(a,c)
结果如下
tensor(0.9549, grad_fn=<BinaryCrossEntropyBackward0>)
计算b,c之间的Loss,由于b的每一个元素在正负无穷之间:
1 可直接调用torch.nn.BCEWithLogitsLoss()
2 先用Sigmoid函数将数值转化为0到1之间,再用torch.nn.BCELoss()
torch.nn.BCEWithLogitsLoss()(b,c)
torch.nn.BCELoss()(torch.sigmoid(b),c)
返回结果:
tensor(0.88, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)
tensor(0.88, grad_fn=<BinaryCrossEntropyBackward0>)
如直接使用:
torch.nn.BCELoss()(b,c)
会产生报错:
RuntimeError: all elements of input should be between 0 and 1