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 相关文章推荐
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
python opencv 图像尺寸变换方法
Apr 02 Python
对python append 与浅拷贝的实例讲解
May 04 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
Python的垃圾回收机制详解
Aug 28 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Python FFT合成波形的实例
Dec 04 Python
python怎么判断模块安装完成
Jun 19 Python
Python如何给你的程序做性能测试
Jul 29 Python
如何编写python的daemon程序
Jan 07 Python
Python数据分析之pandas函数详解
Apr 21 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/04/09 欧美动漫
PHP新手上路(二)
2006/10/09 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
取numpy数组的某几行某几列方法
2018/04/03 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
iostream与iostream.h的区别
2015/01/16 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
红领巾广播站广播稿
2014/02/01 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python