Pytorch中Softmax与LogSigmoid的对比分析


Posted in Python onJune 05, 2021

Pytorch中Softmax与LogSigmoid的对比

torch.nn.Softmax

作用:

1、将Softmax函数应用于输入的n维Tensor,重新改变它们的规格,使n维输出张量的元素位于[0,1]范围内,并求和为1。

2、返回的Tensor与原Tensor大小相同,值在[0,1]之间。

3、不建议将其与NLLLoss一起使用,可以使用LogSoftmax代替之。

4、Softmax的公式:

Pytorch中Softmax与LogSigmoid的对比分析

参数:

维度,待使用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

公式:

Pytorch中Softmax与LogSigmoid的对比分析

函数图:

Pytorch中Softmax与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,也就是输出的是概率分布,具体公式如下:

Pytorch中Softmax与LogSigmoid的对比分析

这保证输出值都大于0,在0,1范围内。

而nn.LogSoftmax()公式如下:

Pytorch中Softmax与LogSigmoid的对比分析

由于softmax输出都是0-1之间的,因此logsofmax输出的是小于0的数,

softmax求导:

Pytorch中Softmax与LogSigmoid的对比分析

logsofmax求导:

Pytorch中Softmax与LogSigmoid的对比分析

例子:

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]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之实现石头剪刀布游戏示例
Feb 11 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
python执行get提交的方法
Apr 29 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python在文本开头插入一行的实例
May 02 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
django的ORM模型的实现原理
Mar 04 Python
python抖音表白程序源代码
Apr 07 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
pytorch 梯度NAN异常值的解决方案
Jun 05 #Python
pytorch 权重weight 与 梯度grad 可视化操作
PyTorch 如何检查模型梯度是否可导
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 #Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 #Python
You might like
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php采集速度探究总结(原创)
2008/04/18 PHP
php连接数据库代码应用分析
2011/05/29 PHP
js用typeof方法判断undefined类型
2014/07/15 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
express express-session的使用小结
2018/12/12 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
Python中的字符串替换操作示例
2016/06/27 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
户外用品商店创业计划书
2014/01/29 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
工程承包协议书
2014/04/22 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
学雷锋日活动总结
2015/02/06 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏