Pyroch损失函数之BCELoss

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

1、单标签

Pyroch损失函数之BCELoss_第1张图片

这个图像是不是猫:1代表是,0代表不是。这就是单标签的二分类问题。 

2、多标签

Pyroch损失函数之BCELoss_第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=)
target: tensor([[1., 0., 0.],
        [0., 1., 1.],
        [1., 1., 0.]])
output: tensor(0.7698, grad_fn=)

 

总结:我们可以看出来,把输入的数据先进行sigmod,然后再计算loss。还有一个损失函数BCEWithLogitsLoss()。它将sigmod集成到一块了。因此如果不想用sigmod直接用这个处理就可以了。而且使用这个损失函数还不会造成梯度消失问题。

 

你可能感兴趣的:(Pytorch,损失函数,深度学习,神经网络,tensorflow,人工智能,python)