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中将单词首字母大写的capitalize()方法
May 18 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
wxPython实现窗口用图片做背景
Apr 25 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
Python Logging 日志记录入门学习
Jun 02 Python
python实现验证码识别功能
Jun 07 Python
简单了解python反射机制的一些知识
Jul 13 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
tensorflow之并行读入数据详解
Feb 05 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
python实现滑雪游戏
Feb 22 Python
python 实现图片批量压缩的示例
Dec 18 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 SQL防注入代码集合
2008/04/25 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
Jquery Ajax请求代码(2)
2011/01/07 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
JavaScript实现新年倒计时效果
2018/11/17 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
python使用cPickle模块序列化实例
2014/09/25 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Python打包可执行文件的方法详解
2016/09/19 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Python反射用法实例简析
2017/12/22 Python
python字符串查找函数的用法详解
2019/07/08 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
前厅收银主管岗位职责
2014/02/04 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
教师党员承诺书2015
2015/01/21 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
导游词之崇武古城
2019/10/07 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android