Pyroch损失函数之BCELoss

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

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

 

  • 16
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值