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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
Python多继承顺序实例分析
May 26 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
python实现串口通信的示例代码
Feb 10 Python
Pycharm安装python库的方法
Nov 24 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
取得传值的函数
2006/10/27 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
javascript数组的使用
2013/03/28 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中的time模块与datetime模块用法总结
2016/06/30 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
python实现大转盘抽奖效果
2019/01/22 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python shutil模块用法实例分析
2019/10/02 Python
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
自我评价范文点评
2013/12/04 职场文书
企业文化宣传标语
2014/06/09 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
整改通知书格式
2015/04/22 职场文书
销售会议开幕词
2016/03/04 职场文书