Pytorch中Softmax与LogSigmoid的对比分析
Pytorch中Softmax与LogSigmoid的对比
torch.nn.Softmax
作用:
1、将Softmax函数应用于输入的n维Tensor,重新改变它们的规格,使n维输出张量的元素位于[0,1]范围内,并求和为1。
2、返回的Tensor与原Tensor大小相同,值在[0,1]之间。
3、不建议将其与NLLLoss一起使用,可以使用LogSoftmax代替之。
4、Softmax的公式:
参数:
维度,待使用softmax计算的维度。
例子:
# 随机初始化一个tensor a = torch.randn(2, 3) print(a) # 输出tensor # 初始化一个Softmax计算对象,在输入tensor的第2个维度上进行此操作 m = nn.Softmax(dim=1) # 将a进行softmax操作 output = m(a) print(output) # 输出tensor tensor([[ 0.5283, 0.3922, -0.0484], [-1.6257, -0.4775, 0.5645]]) tensor([[0.4108, 0.3585, 0.2307], [0.0764, 0.2408, 0.6828]])
可以看见的是,无论输入的tensor中的值为正或为负,输出的tensor中的值均为正值,且加和为1。
当m的参数dim=1时,输出的tensor将原tensor按照行进行softmax操作;当m的参数为dim=0时,输出的tensor将原tensor按照列进行softmax操作。
深度学习拓展:
一般来说,Softmax函数会用于分类问题上。例如,在VGG等深度神经网络中,图像经过一系列卷积、池化操作后,我们可以得到它的特征向量,为了进一步判断此图像中的物体属于哪个类别,我们会将该特征向量变为:类别数 * 各类别得分 的形式,为了将得分转换为概率值,我们会将该向量再经过一层Softmax处理。
torch.nn.LogSigmoid
公式:
函数图:
可以见得,函数值在[0, -]之间,输入值越大函数值距离0越近,在一定程度上解决了梯度消失问题。
例子:
a = [[ 0.5283, 0.3922, -0.0484], [-1.6257, -0.4775, 0.5645]] a = torch.tensor(a) lg = nn.LogSigmoid() lgoutput = lg(a) print(lgoutput) tensor([[-0.4635, -0.5162, -0.7176], [-1.8053, -0.9601, -0.4502]])
二者比较:
import torch import torch.nn as nn # 设置a为 2*3 的tensor a = [[ 0.5283, 0.3922, -0.0484], [-1.6257, -0.4775, 0.5645]] a = torch.tensor(a) print(a) print('a.mean:', a.mean(1, True)) # 输出a的 行平均值 m = nn.Softmax(dim=1) # 定义Softmax函数,dim=1表示为按行计算 lg = nn.LogSigmoid() # 定义LogSigmoid函数 output = m(a) print(output) # 输出a经过Softmax的结果的行平均值 print('output.mean:', output.mean(1, True)) lg_output = lg(a) print(lg_output) # 输出a经过LogSigmoid的结果的行平均值 print('lgouput.mean:', lg_output.mean(1, True)) # 结果: tensor([[ 0.5283, 0.3922, -0.0484], [-1.6257, -0.4775, 0.5645]]) a.mean: tensor(-0.1111) tensor([[0.4108, 0.3585, 0.2307], [0.0764, 0.2408, 0.6828]]) output.mean: tensor([[0.3333], [0.3333]]) # 经过Softmax的结果的行平均值 tensor([[-0.4635, -0.5162, -0.7176], [-1.8053, -0.9601, -0.4502]]) lgouput.mean: tensor([[-0.5658], [-1.0719]]) # 经过LogSigmoid的结果的行平均值
由上可知,继续考虑分类问题,相同的数据,经过Softmax和LogSigmoid处理后,若取最大概率值对应类别作为分类结果,那么:
1、第一行数据经过Softmax后,会选择第一个类别;经过LogSigmoid后,会选择第一个。
2、第二行数据经过Softmax后,会选择第三个类别;经过LogSigmoid后,会选择第三个。
3、一般来说,二者在一定程度上区别不是很大,由于sigmoid函数存在梯度消失问题,所以被使用的场景不多。
4、但是在多分类问题上,可以尝试选择Sigmoid函数来作为分类函数,因为Softmax在处理多分类问题上,会更容易出现各项得分十分相近的情况。瓶颈值可以根据实际情况定。
nn.Softmax()与nn.LogSoftmax()
nn.Softmax()计算出来的值,其和为1,也就是输出的是概率分布,具体公式如下:
这保证输出值都大于0,在0,1范围内。
而nn.LogSoftmax()公式如下:
由于softmax输出都是0-1之间的,因此logsofmax输出的是小于0的数,
softmax求导:
logsofmax求导:
例子:
import torch.nn as nn import torch import numpy as np
layer1=nn.Softmax() layer2=nn.LogSoftmax() input=np.asarray([2,3]) input=Variable(torch.Tensor(input)) output1=layer1(input) output2=layer2(input) print('output1:',output1) print('output2:',output2)
输出:
output1: Variable containing:
0.2689
0.7311
[torch.FloatTensor of size 2]output2: Variable containing:
-1.3133
-0.3133
[torch.FloatTensor of size 2]
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
pytorch nn.Conv2d()中的padding以及输出大小方式
今天小编就为大家分享一篇pytorch nn.Conv2d()中的padding以及输出大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
- 这篇文章主要介绍了Pytorch之扩充tensor的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
- 这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-08
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
今天小编就为大家分享一篇pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
这篇文章主要介绍了从Pytorch模型pth文件中读取参数成numpy矩阵的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-04Pytorch 的损失函数Loss function使用详解
今天小编就为大家分享一篇Pytorch 的损失函数Loss function使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 今天小编就为大家分享一篇pytorch中的上采样以及各种反操作,求逆操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-30
- 今天小编就为大家分享一篇Pytorch实现LSTM和GRU示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
解决Pytorch dataloader时报错每个tensor维度不一样的问题
这篇文章主要介绍了解决Pytorch dataloader时报错每个tensor维度不一样的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-28pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
今天小编就为大家分享一篇pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 这篇文章主要介绍了pytorch深度学习中对softmax实现进行了详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-09-30
- 今天小编就为大家分享一篇Pytorch 计算误判率,计算准确率,计算召回率的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了pytorch中的squeeze函数、cat函数使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-20
- 这篇文章主要介绍了Pytorch如何切换 cpu和gpu的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-01
- 今天小编就为大家分享一篇pytorch动态网络以及权重共享实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-29