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 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python实现求最长回文子串长度
Jan 22 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
python调用百度语音识别api
Aug 30 Python
python调用百度REST API实现语音识别
Aug 30 Python
Python异常处理知识点总结
Feb 18 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
django实现支付宝支付实例讲解
Oct 17 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
Python 如何安装Selenium
May 06 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 compact 通过变量创建数组
2016/11/15 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
简单分析python的类变量、实例变量
2019/08/23 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
python3 xpath和requests应用详解
2020/03/06 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
python中四舍五入的正确打开方式
2021/01/18 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
单位领导证婚词
2014/01/14 职场文书
将相和教学反思
2014/02/04 职场文书
会计学生自我鉴定
2014/02/06 职场文书
2014年协会工作总结
2014/11/22 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Python作用域和名称空间的详细介绍
2022/04/13 Python