关于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 (2)
Oct 31 Python
python图像处理之镜像实现方法
May 30 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python去掉行尾的换行符方法
Jan 04 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
python 字典访问的三种方法小结
Dec 05 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
Python类成员继承重写的实现
Sep 16 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自定义urlencode,urldecode函数实例
2015/03/24 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
jquery实现select选中行、列合计示例
2014/04/25 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python装饰器的函数式编程详解
2015/02/27 Python
python模块之re正则表达式详解
2017/02/03 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
如何用python 操作zookeeper
2020/12/28 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
为什么要用EJB
2014/04/17 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
优秀学生事迹材料
2014/02/08 职场文书
倡议书格式范文
2014/04/14 职场文书
校园广播稿100字
2014/10/06 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
学习与创新自我评价
2015/03/09 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
新店开张宣传语
2015/07/13 职场文书
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python