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多线程实例教程
Sep 06 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python编程之多态用法实例详解
May 19 Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
python requests.get带header
May 05 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
Python实战之实现简易的学生选课系统
May 25 Python
基于Python实现将列表数据生成折线图
Mar 23 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版)
2006/10/09 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
戴森英国官网:Dyson英国
2019/05/07 全球购物
现金出纳岗位职责
2014/03/15 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
购房委托书范本
2014/09/18 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
python实现局部图像放大
2021/11/17 Python
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android