关于tensorflow softmax函数用法解析


Posted in Python onJune 30, 2020

如下所示:

def softmax(logits, axis=None, name=None, dim=None):
 """Computes softmax activations.
 This function performs the equivalent of
  softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)
 Args:
 logits: A non-empty `Tensor`. Must be one of the following types: `half`,
  `float32`, `float64`.
 axis: The dimension softmax would be performed on. The default is -1 which
  indicates the last dimension.
 name: A name for the operation (optional).
 dim: Deprecated alias for `axis`.
 Returns:
 A `Tensor`. Has the same type and shape as `logits`.
 Raises:
 InvalidArgumentError: if `logits` is empty or `axis` is beyond the last
  dimension of `logits`.
 """
 axis = deprecation.deprecated_argument_lookup("axis", axis, "dim", dim)
 if axis is None:
 axis = -1
 return _softmax(logits, gen_nn_ops.softmax, axis, name)

softmax函数的返回结果和输入的tensor有相同的shape,既然没有改变tensor的形状,那么softmax究竟对tensor做了什么?

答案就是softmax会以某一个轴的下标为索引,对这一轴上其他维度的值进行 激活 + 归一化处理

一般来说,这个索引轴都是表示类别的那个维度(tf.nn.softmax中默认为axis=-1,也就是最后一个维度)

举例:

def softmax(X, theta = 1.0, axis = None):
 """
 Compute the softmax of each element along an axis of X.
 Parameters
 ----------
 X: ND-Array. Probably should be floats.
 theta (optional): float parameter, used as a multiplier
  prior to exponentiation. Default = 1.0
 axis (optional): axis to compute values along. Default is the
  first non-singleton axis.
 Returns an array the same size as X. The result will sum to 1
 along the specified axis.
 """
 
 # make X at least 2d
 y = np.atleast_2d(X)
 
 # find axis
 if axis is None:
  axis = next(j[0] for j in enumerate(y.shape) if j[1] > 1)
 
 # multiply y against the theta parameter,
 y = y * float(theta)
 
 # subtract the max for numerical stability
 y = y - np.expand_dims(np.max(y, axis = axis), axis)
 
 # exponentiate y
 y = np.exp(y)
 
 # take the sum along the specified axis
 ax_sum = np.expand_dims(np.sum(y, axis = axis), axis)
 
 # finally: divide elementwise
 p = y / ax_sum
 
 # flatten if X was 1D
 if len(X.shape) == 1: p = p.flatten()
 
 return p
c = np.random.randn(2,3)
print(c)
# 假设第0维是类别,一共有里两种类别
cc = softmax(c,axis=0)
# 假设最后一维是类别,一共有3种类别
ccc = softmax(c,axis=-1)
print(cc)
print(ccc)

结果:

c:
[[-1.30022268 0.59127472 1.21384177]
 [ 0.1981082 -0.83686108 -1.54785864]]
cc:
[[0.1826746 0.80661068 0.94057075]
 [0.8173254 0.19338932 0.05942925]]
ccc:
[[0.0500392 0.33172426 0.61823654]
 [0.65371718 0.23222472 0.1140581 ]]

可以看到,对axis=0的轴做softmax时,输出结果在axis=0轴上和为1(eg: 0.1826746+0.8173254),同理在axis=1轴上做的话结果的axis=1轴和也为1(eg: 0.0500392+0.33172426+0.61823654)。

这些值是怎么得到的呢?

以cc为例(沿着axis=0做softmax):

关于tensorflow softmax函数用法解析

以ccc为例(沿着axis=1做softmax):

关于tensorflow softmax函数用法解析

知道了计算方法,现在我们再来讨论一下这些值的实际意义:

cc[0,0]实际上表示这样一种概率: P( label = 0 | value = [-1.30022268 0.1981082] = c[*,0] ) = 0.1826746

cc[1,0]实际上表示这样一种概率: P( label = 1 | value = [-1.30022268 0.1981082] = c[*,0] ) = 0.8173254

ccc[0,0]实际上表示这样一种概率: P( label = 0 | value = [-1.30022268 0.59127472 1.21384177] = c[0]) = 0.0500392

ccc[0,1]实际上表示这样一种概率: P( label = 1 | value = [-1.30022268 0.59127472 1.21384177] = c[0]) = 0.33172426

ccc[0,2]实际上表示这样一种概率: P( label = 2 | value = [-1.30022268 0.59127472 1.21384177] = c[0]) = 0.61823654

将他们扩展到更多维的情况:假设c是一个[batch_size , timesteps, categories]的三维tensor

output = tf.nn.softmax(c,axis=-1)

那么 output[1, 2, 3] 则表示 P(label =3 | value = c[1,2] )

以上这篇关于tensorflow softmax函数用法解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python脚本实现查找webshell的方法
Jul 31 Python
Python中函数的用法实例教程
Sep 08 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
pthon贪吃蛇游戏详细代码
Jan 27 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
python内置模块collections知识点总结
Dec 19 Python
python中id函数运行方式
Jul 03 Python
python如何运行js语句
Sep 09 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 Python
基于tensorflow for循环 while循环案例
Jun 30 #Python
解析Tensorflow之MNIST的使用
Jun 30 #Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 #Python
Python requests模块安装及使用教程图解
Jun 30 #Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 #Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 #Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 #Python
You might like
二招解决php乱码问题
2012/03/25 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
为python设置socket代理的方法
2015/01/14 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python实现顺时针打印矩阵
2019/03/02 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
中国合伙人观后感
2015/06/02 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
实施意见格式范本
2015/06/05 职场文书
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫