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使用Tkinter显示网络图片的方法
Apr 24 Python
深入学习Python中的装饰器使用
Jun 20 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
详解Python sys.argv使用方法
May 10 Python
linux下python中文乱码解决方案详解
Aug 28 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
Python数据可视化:泊松分布详解
Dec 07 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
python实现人机猜拳小游戏
Feb 03 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
Python如何急速下载第三方库详解
Nov 02 Python
Jupyter Notebook安装及使用方法解析
Nov 12 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
德生H-501的评价与改造
2021/03/02 无线电
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
Python+微信接口实现运维报警
2016/08/27 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
Python实现把类当做字典来访问
2019/12/16 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
方正Java笔试题
2014/07/03 面试题
《再见了,亲人》教学反思
2014/02/26 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python