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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python(Tornado)模拟登录小米抢手机
Nov 12 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
python对常见数据类型的遍历解析
Aug 27 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
Python使用Pygame绘制时钟
Nov 29 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 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
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python 获取网页编码方式实现代码
2017/03/11 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
Unix控制后台进程都有哪些进程
2016/09/22 面试题
2015年公司国庆放假通知
2015/07/30 职场文书
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技