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使用psutil模块获取系统状态
Aug 27 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
django 修改server端口号的方法
May 14 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
python中删除某个元素的方法解析
Nov 05 Python
解决Python二维数组赋值问题
Nov 28 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python调用jar包方法实现过程解析
Aug 11 Python
python图片合成的示例
Nov 09 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
Python中的变量与常量
Nov 11 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
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
js中的string.format函数代码
2020/08/11 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
实例详解Python模块decimal
2019/06/26 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
python 字符串格式化的示例
2020/09/21 Python
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
Java基础面试题
2012/11/02 面试题
六五普法规划实施方案
2014/03/21 职场文书
党员领导干部承诺书
2014/05/28 职场文书
天猫活动策划方案
2014/08/21 职场文书
个人作风建设心得体会
2014/10/22 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL