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中字典(Dictionary)用法实例详解
May 30 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
django url到views参数传递的实例
Jul 19 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
详解django中Template语言
Feb 22 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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生成图片缩略图的方法
2015/04/07 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
python简单读取大文件的方法
2016/07/01 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python aiohttp的使用详解
2019/06/20 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
初三英语教学计划
2015/01/23 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
js判断两个数组相等的5种方法
2022/05/06 Javascript
python高温预警数据获取实例
2022/07/23 Python
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers