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循环监控远程端口的方法
Mar 14 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
python+pandas分析nginx日志的实例
Apr 28 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
UI自动化定位常用实现方法代码示例
Oct 27 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操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
javascript继承之为什么要继承
2012/11/10 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
python使用opencv进行人脸识别
2017/04/07 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
python GUI模拟实现计算器
2020/06/22 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
美国滑板店:Tactics
2020/11/08 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
潘婷洗发水广告词
2014/03/14 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
MySQL 字符集 character
2022/05/04 MySQL