二分类、多分类、多标签、softmax、sigmoid、pytorch实现

二分类、多分类、多标签、softmax、sigmoid、pytorch实现

参考:多标签分类与BCEloss - 简书 (jianshu.com)

25、二分类、多分类与多标签问题的区别 - Andy_George - 博客园 (cnblogs.com)

Sigmoid函数_百度百科 (baidu.com)

(7条消息) Sigmoid函数_saltriver的专栏-CSDN博客_sigmoid

BCELoss — PyTorch 1.7.0 documentation

CrossEntropyLoss — PyTorch 1.7.0 documentation

Pytorch里的CrossEntropyLoss详解 - marsggbo - 博客园 (cnblogs.com)

概念

二分类

表示分类任务中有两个类别,每个样本都被设置了一个且仅有一个标签 0 或者 1。例如,目标是识别出一幅图片是不是猫。训练一个分类器,输入一幅图片,用特征向量x表示输入,输出y=0或1,y=0表示是猫,y=1表示不是猫。

多分类

表示分类任务中有多个类别, 每个样本都被设置了一个且仅有一个标签。比如对一堆水果图片分类, 它们可能是橘子、苹果、梨等。 一个水果图像的标签可以是苹果或者梨, 但是同时不可能是两者。

多标签

每个样本都有一系列的目标标签。例如如下图,用做多标签时,该图的标签有云、树、房子、草地等。这些标签互相不排斥。

简单总结

sigmoid\softmax

sigmoid

Sigmoid函数由下列公式定义

 

图像:当x=0时S(x)=0.5

Sigmoid 曲线

特点:

  • sigmoid函数连续,光滑,严格单调,以(0,0.5)中心对称,是一个非常良好的阈值函数。
  • 当x趋近负无穷时,y趋近于0;趋近于正无穷时,y趋近于1;x=0时,y=0.5。在x超出[-6,6]的范围后,函数值基本上没有变化,值非常接近,在应用中一般不考虑。
  • Sigmoid函数的值域范围限制在(0,1)之间,[0,1]与概率值的范围是相对应的,因此sigmoid函数就能与一个概率分布联系起来了。
  • Sigmoid函数的导数是其本身的函数,即f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x)),计算非常方便,也非常节省计算时间。推导过程如下:
  • 根据常用的求导公式,得到:f′(x)=(−1)(1+e−x)−2(0+(−1)e−x)=e−x(1+e−x)2=e−x1+e−x11+e−xf′(x)=(−1)(1+e−x)−2(0+(−1)e−x)=e−x(1+e−x)2=e−x1+e−x11+e−x
  • 二分类问题,都假定是服从伯努利分布。伯努利分布变形推导后为sigmoid函数,推导见参考文章[(7条消息) Sigmoid函数_saltriver的专栏-CSDN博客_sigmoid]
  • 缺点:1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。2.其输出并不是以0为中心的。

softmax

定义:

更形象的图如下:

总结

sigmoid适用于二分类,当识别一幅图像是不是猫,将图像放入分类器中,sigmoid会得出一个值y,当y<0.5时认为y=0,则认为该图像不是猫

softmax适用于多分类,当识别一张图像属于猫、狗、鸟三类中的哪一类,将图像放入分类器中,会得到类似[0.6,0.1,0.3]三个值,三个值相加总和为1,认为为猫的概率是0.6。在确定类别时,取概率最大的,认为这种图像属于猫的类别。

pytorch实现

nn.BCELoss

公式为:

官方代码:torch.nn.BCELoss(weight: Optional[torch.Tensor] = Nonesize_average=Nonereduce=Nonereduction: str = 'mean')

weight:给每个batch的loss分配比例。如果需要,则必须为nbatch张量的大小。

size_average:不推荐使用。默认为True。在默认情况下,loss为batch中每个元素loss的平均。

reduce:默认为true,对每个minibatch做平均或加和。

reduction:'none':不应用。'mean':输出loss的平均。'sum':输出loss的总和。

!!注意:在使用BCELoss之前要用sigmoid

官方使用:

>>> m = nn.Sigmoid()
>>> loss = nn.BCELoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)#input和target尺寸相同,即公式中的和
>>> output = loss(m(input), target)#把input放入sigmoid的在放入loss中
>>> output.backward()

nn.CrossEntropyLoss

官方代码:torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor] = Nonesize_average=Noneignore_index: int = -100reduce=Nonereduction: str = 'mean')

公式:其中N为真实类别,p为真实值,q为被softmax处理过后的预测值

CrossEntropyLoss中结合了nn.LogSoftmax()和nn.NLLLoss():

  • log_softmax:logsoftmax合并在一起执行。
  • null_loss:全称是negative log likelihood loss,函数表达式为:f(x,class)=-x[class]。例如假设x=[1,2,3],class=2,那么f(x,class)=−x[2]=−3

交叉熵的公式转化成:loss(x,class)=-log(\frac{exp(x[class])}{\sum exp(x[j])})

官方代码:

不需要处理log_softmax和null_loss,

input和target尺寸相同,直接输入nn.CrossEntropyLoss即可

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()
  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 paddle框架实现的bilstm+attention,cnn,bow模型的二分类,多分类,多标签分类源码+项目说明.zip paddle框架实现的bilstm+attention,cnn,bow模型的二分类,多分类,多标签分类源码+项目说明.zip paddle框架写的基于ERNIE的text classification。采用ernie+fc的方式训练,包括差分学习率,softmax分类任务(acti_fun: softmax),sigmoid二分类任务(acti_fun: sigmoid,且训练数据标签种类只能是2个,在), sigmoid标签任务(acti_fun: sigmoid,且训练数据标签种类超过2个)。均可在${project}/pretrained_text_classification/config/train_conf.ini进行配置。具体使用那种模型在config中可以配置,一目了然。 ${project}/text_classification paddle框架实现**BoWModel, LSTMModel, BiLSTMAtt,GRUModel,BiGRUAtt,CNNModel**模型,包括差分学习率,**softmax分类任务**(acti_fun: softmax),**sigmoid二分类任务**(acti_fun: sigmoid,且训练数据标签种类只能是2个,在), **sigmoid标签任务**(acti_fun: sigmoid,且训练数据标签种类超过2个)。均可在${project}/text_classification/config/train_conf.ini进行配置。具体使用那种模型在config中可以配置,一目了然。 运行步骤 1.**标签配置:**在/input/label.txt中进行标签配置,格式参考Demo,如果是sigmoid二分类建议labelid为0的是负样本,1的是正样本。 2.**数据准备:**在/input/train_data/train.txt中按照demo格式放入待训练的数据,两列,第一列为需要分类的文本,第二列为labelname(类别需在${project_dir}/input/label.txt配置)。同理,可在dev_data和test_data增加验证和测试数据 3.**环境准备:**按照requirments.txt安装相应的包即可,修改/env.sh配置cuda位置和使用的gpu卡,默认0卡。然后终端执行 `source env.sh ` 4.**训练模型:**`python3 src/train.py config/train_conf.ini`模型会保存在text_classification_paddle/model/dygraph/(动态图模型)和text_classification_paddle/model/dygraph/(静态图模型用于推理部署) 文件夹中(脚本自动创建文件夹) 5.**预测模型:**`cat input/test_data/test.txt | python3 src/predict.py config/train_conf.ini` 预测结果会直接打印到终端,可自行重定向到指定文件。 **其他:** 友情提供多分类,多标签,二分类标数据集供学习交流 链接:https://pan.baidu.com/s/1A9VEjvgcOGznTeSPaRGrIQ?pwd=3J36 提取码:见项目说明 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
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进行多标签分类的基本步骤。需要注意的是,在数据准备过程中要保证数据类别平衡,训练样本足够丰富,模型设计合理,调整超参数来提高模型性能。多标签分类任务可以应用于很多实际问题,如图像标签分类、文本标签分类等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值