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设计模式编程中的访问者与观察者模式
Jan 26 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python入门之三角函数tan()函数实例详解
Nov 08 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
30行Python代码实现高分辨率图像导航的方法
May 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
php smarty模版引擎中的缓存应用
2009/12/02 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php中apc缓存使用示例
2013/12/25 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
python清除字符串里非数字字符的方法
2015/07/02 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python并行分布式框架Celery详解
2018/10/15 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
涨价通知
2015/04/23 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
电影复兴之路观后感
2015/06/02 职场文书
音乐剧猫观后感
2015/06/04 职场文书
600字作文之感受大自然
2019/11/27 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
JVM之方法返回地址详解
2022/02/28 Java/Android
详解Python中__new__方法的作用
2022/03/31 Python
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python