Pyroch损失函数之BCELoss

    技术2022-07-15  75

    这也是最近在做的一个模型中的损失函数,所有就一探究竟了解一下这个函数。首先它是一个二分类损失函数。可以是单标签的损失函数也可是多标签的损失函数。

    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直接用这个处理就可以了。而且使用这个损失函数还不会造成梯度消失问题。

     

    Processed: 0.020, SQL: 9