关于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 相关文章推荐
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
提升Python程序运行效率的6个方法
Mar 31 Python
Python中的面向对象编程详解(上)
Apr 13 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
对命令行模式与python交互模式介绍
May 12 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
10个python爬虫入门实例(小结)
Nov 01 Python
Python网络编程之ZeroMQ知识总结
Apr 25 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
php自动跳转中英文页面
2008/07/29 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
Koa项目搭建过程详细记录
2018/04/12 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
Django进阶之CSRF的解决
2018/08/01 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
搞笑获奖感言
2014/01/30 职场文书
电台实习生求职信
2014/02/25 职场文书
公司承诺书范文
2014/05/19 职场文书
白岩松演讲
2014/05/21 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
幼儿园教师辞职信
2019/06/21 职场文书