Softmax函数原理及Python实现过程解析


Posted in Python onMay 22, 2020

Softmax原理

Softmax函数用于将分类结果归一化,形成一个概率分布。作用类似于二分类中的Sigmoid函数。

对于一个k维向量z,我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果,具体计算公式为:

Softmax函数原理及Python实现过程解析

对于k维向量z来说,其中zi∈R,我们使用指数函数变换可以将元素的取值范围变换到(0,+∞),之后我们再所有元素求和将结果缩放到[0,1],形成概率分布。

常见的其他归一化方法,如max-min、z-score方法并不能保证各个元素为正,且和为1。

Softmax性质

输入向量x加上一个常数c后求softmax结算结果不变,即:

Softmax函数原理及Python实现过程解析

我们使用softmax(x)的第i个元素的计算来进行证明:

Softmax函数原理及Python实现过程解析

函数实现

由于指数函数的放大作用过于明显,如果直接使用softmax计算公式

Softmax函数原理及Python实现过程解析

进行函数实现,容易导致数据溢出(上溢)。所以我们在函数实现时利用其性质:先对输入数据进行处理,之后再利用计算公式计算。具体使得实现步骤为:

  • 查找每个向量x的最大值c;
  • 每个向量减去其最大值c, 得到向量y = x-c;
  • 利用公式进行计算,softmax(x) = softmax(x-c) = softmax(y)

代码如下:

import numpy as np

def softmax(x):
  """
  softmax函数实现
  参数:
  x --- 一个二维矩阵, m * n,其中m表示向量个数,n表示向量维度
  返回:
  softmax计算结果
  """
  assert(len(X.shape) == 2)
  row_max = np.max(X, axis=axis).reshape(-1, 1)
  X -= row_max
  X_exp = np.exp(X)
  s = X_exp / np.sum(X_exp, axis=axis, keepdims=True)

  return s

测试一下:

a = [[1,2,3],[-1,-2,-3]]
b = [[1,2,3]]
c = [1,2,3]
a = np.array(a)
b = np.array(b)
c = np.array(c)

print(softmax(a))
print(softmax(b))
print(softmax(c)) # error

输出结果为:

[[ 0.09003057 0.24472847 0.66524096]
[ 0.66524096 0.24472847 0.09003057]]
[[ 0.09003057 0.24472847 0.66524096]]
Traceback (most recent call last):
assert(len(X.shape) == 2)
AssertionError

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python面向对象之反射/自省机制实例分析
Aug 24 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
解决Django中多条件查询的问题
Jul 18 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
python字典的遍历3种方法详解
Aug 10 Python
pandas的to_datetime时间转换使用及学习心得
Aug 11 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python 实现简单的计算器(gui界面)
Nov 11 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
Python接口测试文件上传实例解析
May 22 #Python
计算Python Numpy向量之间的欧氏距离实例
May 22 #Python
python numpy矩阵信息说明,shape,size,dtype
May 22 #Python
python查看矩阵的行列号以及维数方式
May 22 #Python
30行Python代码实现高分辨率图像导航的方法
May 22 #Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 #Python
Python pandas如何向excel添加数据
May 22 #Python
You might like
php设计模式 Delegation(委托模式)
2011/06/26 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
pandas对指定列进行填充的方法
2018/04/11 Python
python求最大连续子数组的和
2018/07/07 Python
django_orm查询性能优化方法
2018/08/20 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
python Cartopy的基础使用详解
2020/11/01 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
毕业生自荐信
2013/12/14 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
财务简历的自我评价
2014/03/05 职场文书
元宵晚会主持词
2014/03/25 职场文书
党员承诺践诺书
2014/05/20 职场文书
机械机修工岗位职责
2014/08/03 职场文书
大学生党员个人总结
2015/02/13 职场文书
城管个人总结
2015/02/28 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python