继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【2024年】第4天 Softmax算法--处理分类问题(pytorch)

谦瑞
关注TA
已关注
手记 79
粉丝 8
获赞 8
  • Softmax算法本质上也是一种激活函数。

1. 什么是Softmax?

  • 如果判断输入属于某一个类的概率大于属于其他类的概率,那么这个类对应的值就逼近与1,其他类的值就逼近与0.
  • 该算法主要应用应用于多分类问题,而且要求分类值是互斥的,即一个值只能属于其中的一个类。
  • 与Sigmoid之类的激活函数函数不同的是,一般的激活函数只能分两类,因此,可以将Softmax理解为Sigmoid类的激活函数的拓展:
Softmax = exp(logits) / reduce_sum(exp(logits), dim)
  • 把所有值用e的n次方计算出来,求和计算某个值占的比率,保证总和为1.
  • 这里的exp(logits)值得就是elogits
  • 这里的exp表示自然指数函数exp(x) = ex,logits是一个向量,这部分可以理解为对logits中的每个元素都进行指数化。
  • 这里的reduce_sum表示对指定维度进行求和。
  • exp(logits)得到的结果是一个向量。
  • dim表示对哪个维度进行求和。
  • 如果多分类任务中的每个类彼此之间不是互斥关系,则可以使用多个二分类来组成。
  • 一般可以认为通过Softmax计算出来的就是概率。

2. Softmax原理

  • Softmax网络模型输入X1,X2,要准备生成Y1,Y2,Y3三个类别 (w是权重, b为偏置)。
    图片描述
  • 对于属于Y1类的概率,可以转化为输入X1满足某个条件的概率与X2满足某个条件概率的乘积。
  • 在网络模型中,我们把等式两边都进行In运算。
  • 这样,进行In运算后属于Y1类的概率值可以转换为:In运算后的X1满足某个条件的概率加上In运算后的X2满足某个条件的概率。
  • 这样Y1 = X1 * W11 + X2 * W12等于In运算后的Y1的概率了。
  • 这也是在Softmax中要计算一次e的logits次方的原因。
    等式两边进行In运算是神经网络中常用的技巧,主要用来将概率的乘法转变为加法,即In(xy) = Inx + Iny。在后续的计算中,再将其转换为e的X次方,还原成原来的值。
  • 举例:某个样本经过神经网络所生成的值为Y1,Y2,Y3,其中Y1为5,Y2为3,Y3为2,对应的结果就为Y1=5/10=0.5, Y2=3/10=0.3,Y3=2/10=0.2,于是取值最大的Y1为最终的分类。

3. 常用的Softmax接口

  • Pytorch中,Softmax接口是以类的形式提供的。
Softmax接口 描述
torch.nn.Softmax(dim) 计算Softmax,参数dim代表计算的维度。
torch.nn.Softmax2d() 对每个图片进行Softmax处理
torch.nn.LogSoftmax(logits, name=None) 对Softmax取对数,常与NLLLoss联合使用,实现交叉熵损失的计算。

4. Softmax与交叉熵的应用

  • 假设有一个标签labels和一个网络输出值logits,模拟神经网络中计算损失的过程,将其进行交叉熵的计算。
  • 这里使用两种方法进行交叉熵计算:
    1. 使用LogSoftmax和NLLLoss的方法计算交叉熵。
    2. 使用CrossEntropyLoss方法计算交叉熵。
import torch

# Define simulated data
logits = torch.tensor([[2.0, 0.5, 6.0], [0.1, 0.0, 3.0]], requires_grad=True)
labels = torch.tensor([2, 1])

print(logits)
print(labels)

# Compute Softmax
print('Softmax:', torch.nn.Softmax(dim=1)(logits))

# Compute LogSoftmax
logsoftmax = torch.nn.LogSoftmax(dim=1)(logits)
print('logSoftmax:', logsoftmax)

# Compute NLLLoss
output = torch.nn.NLLLoss()(logsoftmax, labels)
print('NLLLoss:', output)

# Compute CrossEntropyLoss
print('CrossEntropyLoss:', torch.nn.CrossEntropyLoss()(logits, labels))

运行结果:
图片描述

  • 首先定义了模拟数据logits与labels。
  • logits:神经网络的计算结果,一共有两个数据,每个数据的结果中包括了3个数值,代表3种分类的结果。
  • labels:神经网络的计算结果对应的标签,一共有两个数值,每个数值代表对应数据的所属分类。
  • 从最后的结果看,使用LogSoftmax和NLLLoss的方法与直接使用CrossEntropyLoss所计算的损失值是一样的。

5. 总结:更好地认识SoftMax

在搭建神经网络模型时,需要使用Softmax将目标分成几类,就在最后一层放几个节点。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP