这也是最近在做的一个模型中的损失函数,所有就一探究竟了解一下这个函数。首先它是一个二分类损失函数。可以是单标签的损失函数也可是多标签的损失函数。
这个图像是不是猫:1代表是,0代表不是。这就是单标签的二分类问题。
和单标签一样,不过这个是多标签而已,所以它的label就是[1,1]。第一列代表有没有狗,第二列代表有没有猫。所以也称之为二进制交叉熵。
m = nn.Sigmoid()
loss = nn.BCELoss()
output = loss(m(input), target)
假设我们有一个3*3的输入,也就是batch_size是3,有3个标签。然后我们的target也是3*3。现在用这个例子做一个演示:
import torch import torch.nn as nn m = nn.Sigmoid() loss = nn.BCELoss() input = torch.randn((3,3), requires_grad=True) target = torch.empty(3,3).random_(2) output = loss(m(input), target) input: tensor([[-0.5288, 0.3353, 1.6142], [-0.7940, 1.5699, -0.1642], [ 0.1262, -0.6596, -1.4198]], requires_grad=True) sigmod: tensor([[0.3708, 0.5830, 0.8340], [0.3113, 0.8278, 0.4590], [0.5315, 0.3408, 0.1947]], grad_fn=<SigmoidBackward>) target: tensor([[1., 0., 0.], [0., 1., 1.], [1., 1., 0.]]) output: tensor(0.7698, grad_fn=<BinaryCrossEntropyBackward>)
总结:我们可以看出来,把输入的数据先进行sigmod,然后再计算loss。还有一个损失函数BCEWithLogitsLoss()。它将sigmod集成到一块了。因此如果不想用sigmod直接用这个处理就可以了。而且使用这个损失函数还不会造成梯度消失问题。