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捕捉和模拟鼠标事件的方法
Jun 03 Python
python操作redis的方法
Jul 07 Python
Python Queue模块详细介绍及实例
Dec 27 Python
Python实现带参数与不带参数的多重继承示例
Jan 30 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
Python 多维List创建的问题小结
Jan 18 Python
python查看数据类型的方法
Oct 12 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
Django日志及中间件模块应用案例
Sep 10 Python
用python写PDF转换器的实现
Oct 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
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php构造函数实例讲解
2013/11/13 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python实现代码统计程序
2019/09/19 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
收款委托书
2014/10/14 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
春晚观后感
2015/06/11 职场文书
学生退学证明
2015/06/23 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers