pytorch 多标签分类以及BCEloss

什么是多标签分类

学习过机器学习的你,也许对分类问题很熟悉。比如下图:

在这里插入图片描述

图片中是否包含房子?你的回答就是有或者没有,这就是一个典型的二分类问题。

在这里插入图片描述

同样,是这幅照片,问题变成了,这幅照片是谁拍摄的?备选答案你,你的父亲,你的母亲?这就变成了一个多分类问题。

在这里插入图片描述

但今天谈论的多标签是什么呢?
如果我问你上面图包含一座房子吗?选项会是YES或NO。

在这里插入图片描述

你会发现图中所示的答案有多个yes,而不同于之前的多分类只有一个yes。

这里思考一下:
一首歌:如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么这些类别之间是互斥的。这首歌属于哪个类别?这是一个什么问题?

一首歌:如果你有四个类别的音乐,分别为:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。这首歌属于哪个类别?这是一个什么问题?

多标签的问题的损失函数是什么

这里需要先了解一下softmax 与 sigmoid函数

在这里插入图片描述
在这里插入图片描述

这两个函数最重要的区别,我们观察一下:

在这里插入图片描述

区别还是很明显的。

综上,我们可以得出以下结论:

在这里插入图片描述

pytorch中的实现

PyTorch提供了两个类来计算二分类交叉熵(Binary Cross Entropy),分别是BCELoss() 和BCEWithLogitsLoss()

看一下源码,参考帮助,我们来看一下

在这里插入图片描述

from torch import autograd
input = autograd.Variable(torch.randn(3,3), requires_grad=True)
print(input)

tensor([[ 1.9072,  1.1079,  1.4906],
        [-0.6584, -0.0512,  0.7608],
        [-0.0614,  0.6583,  0.1095]], requires_grad=True)

因为Note that the targets t[i] should be numbers between 0 and 1.
所以需要先sigmoid:

from torch import nn
m = nn.Sigmoid()
print(m(input))

tensor([[0.8707, 0.7517, 0.8162],
        [0.3411, 0.4872, 0.6815],
        [0.4847, 0.6589, 0.5273]], grad_fn=<SigmoidBackward>)

假设你的target如下:

target = torch.FloatTensor([[0, 1, 1], [1, 1, 1], [0, 0, 0]])
print(target)

tensor([[0., 1., 1.],
        [1., 1., 1.],
        [0., 0., 0.]])

我们先根据源码中公式,计算下:
在这里插入图片描述

import math

r11 = 0 * math.log(0.8707) + (1-0) * math.log((1 - 0.8707))
r12 = 1 * math.log(0.7517) + (1-1) * math.log((1 - 0.7517))
r13 = 1 * math.log(0.8162) + (1-1) * math.log((1 - 0.8162))

r21 = 1 * math.log(0.3411) + (1-1) * math.log((1 - 0.3411))
r22 = 1 * math.log(0.4872) + (1-1) * math.log((1 - 0.4872))
r23 = 1 * math.log(0.6815) + (1-1) * math.log((1 - 0.6815))

r31 = 0 * math.log(0.4847) + (1-0) * math.log((1 - 0.4847))
r32 = 0 * math.log(0.6589) + (1-0) * math.log((1 - 0.6589))
r33 = 0 * math.log(0.5273) + (1-0) * math.log((1 - 0.5273))

r1 = -(r11 + r12 + r13) / 3
#0.8447112733378236
r2 = -(r21 + r22 + r23) / 3
#0.7260397266631787
r3 = -(r31 + r32 + r33) / 3
#0.8292933181294807
bceloss = (r1 + r2 + r3) / 3 
print(bceloss)

0.8000147727101611

核心解读
就是把每一个标签的预测值(sigmoid计算之后)交给cross_entropy函数来进行分类计算。比如样本1是一张图片(r1),r11代表某一个标签(有房子),r12代表某一个标签(有树), r13代表某一个标签(有小狗),最后r1就是样本1的预测值与真实值之间的loss。

我们再对比一下使用torch内置的loss函数:

loss = nn.BCELoss()
print(loss(m(input), target))

tensor(0.8000, grad_fn=<BinaryCrossEntropyBackward>)

和我们自己算的误差非常小,可以忽略。

我们也可以把sigmoid和bce的过程放到一起,使用内建的BCEWithLogitsLoss函数

loss = nn.BCEWithLogitsLoss()
print(loss(input, target))

tensor(0.8000, grad_fn=<BinaryCrossEntropyWithLogitsBackward>)
  • 23
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
PyTorch是一个流行的开源深度学习框架,它提供了丰富的工具和功能来进行多标签分类任务。多标签分类是指一个样本可以属于多个类别,每个类别之间是相互独立的。 在PyTorch中进行多标签分类,我们可以按照以下步骤进行操作: 1. 数据准备:首先,需要准备好带有标签的训练数据集和验证数据集。每个样本应该有一个对应的输入和一个标签,标签是一个二进制向量,其中每个元素表示一个类别,1代表属于该类别,0代表不属于该类别。 2. 构建模型:使用PyTorch的nn模块构建多标签分类模型。可以选择使用现有的预训练模型作为基础模型,也可以自己设计模型。在模型最后一层使用sigmoid激活函数,而不是常用的softmax激活函数,因为sigmoid可以输出独立的概率值而softmax输出的是归一化的概率分布。 3. 定义损失函数和优化器:对于多标签分类任务,常用的损失函数是二分类问题的交叉熵损失,可以使用PyTorch中的BCELoss函数。优化器可以选择常用的Adam或SGD等。 4. 训练模型:按照一般的PyTorch训练流程,将输入样本和标签传入模型,计算损失,进行反向传播和参数更新。 5. 模型评估:通过验证数据集评估模型的性能,可以使用F1 score、accuracy或者precision/recall等指标。可以使用PyTorch中的函数计算这些指标。 以上就是使用PyTorch进行多标签分类的基本步骤。需要注意的是,在数据准备过程中要保证数据类别平衡,训练样本足够丰富,模型设计合理,调整超参数来提高模型性能。多标签分类任务可以应用于很多实际问题,如图像标签分类、文本标签分类等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值