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 16 Python
Python实现模拟时钟代码推荐
Nov 08 Python
python实现发送和获取手机短信验证码
Jan 15 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
python装饰器实例大详解
Oct 25 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
Python实现弹球小游戏
Aug 01 Python
详解Python中openpyxl模块基本用法
Feb 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入门基础之php代码写法
2011/12/30 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
PDO::getAttribute讲解
2019/01/28 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
JS location几个方法小姐
2008/07/09 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
解决yum对python依赖版本问题
2019/07/05 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
最新自我评价范文
2013/11/16 职场文书
平安建设实施方案
2014/03/19 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers