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多线程编程(四):使用Lock互斥锁
Apr 05 Python
Python使用MONGODB入门实例
May 11 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
Django框架模板的使用方法示例
May 25 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
Python Process多进程实现过程
Oct 22 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
Python生成随机验证码代码实例解析
Jun 09 Python
python 基于wx实现音乐播放
Nov 24 Python
vue.js刷新当前页面的实例讲解
Dec 29 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
smarty简单入门实例
2014/11/28 PHP
php模拟post提交数据的方法
2015/02/12 PHP
设定php简写功能的方法
2019/11/28 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
使用JS动态显示文本
2017/09/09 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
python遍历目录的方法小结
2016/04/28 Python
利用Python实现图书超期提醒
2016/08/02 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
反腐倡廉标语
2014/06/24 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
2016年春节慰问信息
2015/03/25 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS