二分类、多分类、多标签、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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值