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描述器descriptor详解
Feb 03 Python
用实例解释Python中的继承和多态的概念
Apr 27 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
python获取list下标及其值的简单方法
Sep 12 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
简单的python协同过滤程序实例代码
Jan 31 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
php中chdir()函数用法实例
2014/11/13 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
js实现聊天对话框
2020/02/08 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
Django实现图片文字同时提交的方法
2015/05/26 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
python数字类型math库原理解析
2020/03/02 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
广州一家公司的.NET面试题
2016/06/11 面试题
物流管理应届生求职信
2013/11/07 职场文书
大客户销售经理职责
2013/12/04 职场文书
个人自我评价范文
2014/02/05 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
应聘教师求职信范文
2015/03/20 职场文书
毕业典礼主持词
2015/06/29 职场文书
英文投诉信格式
2015/07/03 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android