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判断质数(素数)的简单方法讲解
May 05 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
python3.4实现邮件发送功能
May 28 Python
Python返回数组/List长度的实例
Jun 23 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
详解用Python练习画个美队盾牌
Mar 23 Python
python实现字符串和数字拼接
Mar 02 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
python 发送get请求接口详解
Nov 17 Python
教你怎么用python爬取爱奇艺热门电影
May 20 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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
人族 TERRAN 概述
2020/03/14 星际争霸
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
python简单实现AES加密和解密
2019/03/28 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
知识竞赛活动方案
2014/02/18 职场文书
商铺租赁意向书
2014/04/01 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
机电系毕业生求职信
2014/07/11 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python