这也是最近在做的一个模型中的损失函数,所有就一探究竟了解一下这个函数。首先它是一个二分类损失函数。可以是单标签的损失函数也可是多标签的损失函数。
1、单标签
这个图像是不是猫:1代表是,0代表不是。这就是单标签的二分类问题。
2、多标签
和单标签一样,不过这个是多标签而已,所以它的label就是[1,1]。第一列代表有没有狗,第二列代表有没有猫。所以也称之为二进制交叉熵。
3、BCELoos损失函数
class torch.nn.BCELoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')
- weight:可以初始化一个权重矩阵
- size_average:默认是True,表示对求出的loss进行求平均数。比如一个多标签的图像,三个标签求出的loss默认是求平均
- reduction:默认是求和。对于一个batch_size的loss求平均数
- Loss(预测的label必须先进行sigmod然后在放到loss里面去求和), 0<=target[i]<=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直接用这个处理就可以了。而且使用这个损失函数还不会造成梯度消失问题。