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获取apk文件URL地址实例
Nov 01 Python
python实现巡检系统(solaris)示例
Apr 02 Python
Python中使用HTMLParser解析html实例
Feb 08 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python 怎样进行内存管理
Nov 10 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 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学习之数组的定义和填充
2011/04/17 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
新闻内页-JS分页
2006/06/07 Javascript
非常不错的一个javascript 类
2006/11/07 Javascript
javascript 播放器 控制
2007/01/22 Javascript
简单的js表单验证函数
2013/10/28 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
Hibernate持久层技术
2013/12/16 面试题
高二物理教学反思
2014/02/08 职场文书
利群广告词
2014/03/20 职场文书
员工安全承诺书
2014/05/22 职场文书
食品安全演讲稿
2014/09/01 职场文书