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对MySQL数据操作
Apr 06 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
使用Flask集成bootstrap的方法
Jul 24 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python中threading开启关闭线程操作
May 02 Python
查看keras的默认backend实现方式
Jun 19 Python
python实现单机五子棋
Aug 28 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
Python实现聚类K-means算法详解
Jul 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
在PHP中使用模板的方法
2008/05/24 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
python中logging库的使用总结
2017/10/18 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
python实现代码统计器
2019/09/19 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
老师推荐信
2013/10/28 职场文书
公司开业庆典主持词
2014/03/21 职场文书
最常使用的求职信
2014/05/25 职场文书
销售员岗位职责
2014/06/09 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
校本培训个人总结
2015/02/28 职场文书
师范生教育见习总结
2015/06/23 职场文书
服装店员工管理制度
2015/08/07 职场文书
教师教育心得体会
2016/01/19 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书