[TensorFlow]Tensor维度理解_tensorflow tensor的维度怎么看_hangkai_tan的博客-程序员秘密

技术标签: tensorflow  

http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/

Tensor维度理解

Tensor在Tensorflow中是N维矩阵,所以涉及到Tensor的方法,也都是对矩阵的处理。由于是多维,在Tensorflow中Tensor的流动过程就涉及到升维降维,这篇就通过一些接口的使用,来体会Tensor的维度概念。以下是个人体会,有不准确的请指出。

tf.reduce_mean

reduce_mean(
    input_tensor,
    axis=None,
    keep_dims=False,
    name=None,
    reduction_indices=None
)

计算Tensor各个维度元素的均值。这个方法根据输入参数axis的维度上减少输入input_tensor的维度。
举个例子:

x = tf.constant([[1., 1.], [2., 2.]])
tf.reduce_mean(x)  # 1.5
tf.reduce_mean(x, 0)  # [1.5, 1.5]
tf.reduce_mean(x, 1)  # [1.,  2.]

x是二维数组[[1.0,1.0],[2.0, 2.0]]
axis参数取默认值时,计算整个数组的均值:(1.+1.+2.+2.)/4=1.5
axis取0,意味着对列取均值:[1.5, 1.5]
axis取1,意味着对行取均值:[1.0, 2.0]

再换一个3*3的矩阵:

sess = tf.Session()
x = tf.constant([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
print(sess.run(x))
print(sess.run(tf.reduce_mean(x)))
print(sess.run(tf.reduce_mean(x, 0)))
print(sess.run(tf.reduce_mean(x, 1)))

输出结果是

[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]]
5.0
[ 4.  5.  6.]
[ 2.  5.  8.]

如果我再加一维是怎么计算的?

sess = tf.Session()
x = tf.constant([[[1., 1.], [2., 2.]], [[3., 3.], [4., 4.]]])
print(sess.run(x))
print(sess.run(tf.reduce_mean(x)))
print(sess.run(tf.reduce_mean(x, 0)))
print(sess.run(tf.reduce_mean(x, 1)))
print(sess.run(tf.reduce_mean(x, 2)))

我给的输入Tensor是三维数组:

[[[ 1.  1.]
  [ 2.  2.]]

 [[ 3.  3.]
  [ 4.  4.]]]

推测一下,前面二维的经过处理都变成一维的,也就是经历了一次降维,那么现在三维的或许应该变成二维。但现在多了一维,应该从哪个放向做计算呢?
看下结果:

2.5
[[ 2.  2.]
 [ 3.  3.]]
[[ 1.5  1.5]
 [ 3.5  3.5]]
[[ 1.  2.]
 [ 3.  4.]]

发现,
axis参数取默认值时,依然计算整个数组的均值:(float)(1+2+3+4+1+2+3+4)/8=2.5
axis取0,计算方式是:

[[(1+3)/2, (1+3)/2],
 [(2+4)/2, (2+4)/2]]

axis取1,计算方式是:

[[(1+2)/2, (1+2)/2],
 [(3+4)/2, (3+4)/2]]

axis取2,计算方式是:

[[(1+1)/2, (2+2)/2],
 [(3+3)/2, (4+4)/2]]

看到这里,能推断出怎么从四维降到三维吗?
有人总结了一下:

规律:
对于k维的,
tf.reduce_xyz(x, axis=k-1)的结果是对最里面一维所有元素进行求和。
tf.reduce_xyz(x, axis=k-2)是对倒数第二层里的向量对应的元素进行求和。
tf.reduce_xyz(x, axis=k-3)把倒数第三层的每个向量对应元素相加。
链接

拿上面的数组验证这个规律:

[[[ 1.  1.]
  [ 2.  2.]]

 [[ 3.  3.]
  [ 4.  4.]]]

我们的k=3。小括号是一层,在一层内进行计算:
axis=3-1=2,做最内层计算,我们的最内层就是(1,1),(2,2),(3,3),(4,4),计算出来的就是

[[ 1.  2.]
 [ 3.  4.]]

axis=3-2=1,做倒数第二层计算(参考二维计算):([1,1],[2,2])和([3, 3],[4, 4])

[[ 1.5  1.5]
 [ 3.5  3.5]]

axis=3-3=1,做倒数第三层计算:([[1, 1], [2, 2]])([[3, 3], [4, 4]])

[[ 2.  2.]
 [ 3.  3.]]

对于四维的,就贴段结果,自己可以尝试算一下,加深理解。

# input 4-D
[[[[ 1.  1.]
   [ 2.  2.]]

  [[ 3.  3.]
   [ 4.  4.]]]


 [[[ 5.  5.]
   [ 6.  6.]]

  [[ 7.  7.]
   [ 8.  8.]]]]
# axis=none
4.5

# axis=0
[[[ 3.  3.]
  [ 4.  4.]]

 [[ 5.  5.]
  [ 6.  6.]]]

# axis=1
[[[ 2.  2.]
  [ 3.  3.]]

 [[ 6.  6.]
  [ 7.  7.]]]

在tensorflow 1.0版本中,reduction_indices被改为了axis,在所有reduce_xxx系列操作中,都有reduction_indices这个参数,即沿某个方向,使用xxx方法,对input_tensor进行降维。

对于axis参数的作用,文档的解释是

the rank of the tensor is reduced by 1 for each entry in axis

即Tensor在axis的每一个分量上的秩减少1。如何理解矩阵的「秩」? - 马同学的回答 - 知乎

附一张reduction_indices的图

下面再看下第三个参数keep_dims,该参数缺省值是False,如果设置为True,那么减少的维度将被保留为长度为1。
回头看看最开始的例子:

# 2*2
[[ 1.  1.]
 [ 2.  2.]]
# keep_dims=False
[ 1.5  1.5] # 1*2
[ 1.  2.]   #1*2
# keep_dims=True
[[ 1.5  1.5]]   #1*2
[[ 1.]          #2*1
 [ 2.]]

可以看到差别。关于这个参数,还没看到太多介绍,还需要了解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hangkai_tan/article/details/81566880

智能推荐

zbrush-拓扑低模_zb高模怎么拓扑成低模_蝶泳奈何桥.的博客-程序员秘密

title: art-zbrush-zsphere_topology_拓扑低模categories: Arttags: [art, zbrush, ta, topology, 拓扑]date: 2019-01-03 17:03:18comments: falseart-zbrush-zsphere_topology_拓扑低模zshpere 拓扑低模拓扑模型 topology...

Win7与ubuntu双系统开机找不到ubuntu引导项问题解决_easybcd找不到ubuntu_Mr_buffoon的博客-程序员秘密

现在很多人都是使用windows和linux双系统,一般的做法是先安装windows系统,然后再安装ubuntu系统,这样ubuntu的grub就会自己搜寻并添加windows的引导项,这是正常情况下的状态。但是有时候自己不小心在windows里面修改了linux磁盘之前的盘符或者重装了windows系统,又或者使用了windows下的开机引导修复工具,就会导致开机时找不到ubuntu的相关引导项

ZOJ 3596 Digit Number(状态压缩 + BFS)_nyist_xiaod的博客-程序员秘密

题目链接:Click here~~题意:找一个 n 的最小倍数 x ,使 x 中恰好包含 m 个不同的数字。(n 解题思路:首先,要理解题意中”恰好 m 个不同“不一定是 m 个数字。今天有人在群里问的这道题,想了想,果然不会做。。。搜完题解,差不多懂了,记录下。解法叫做 BFS。为什么可以 BFS 呢?直观的想法肯定是, 从小到

python堆栈跟踪_traceback (Runtime) – Python 中文开发手册 - Break易站_weixin_39552317的博客-程序员秘密

Python 中文开发手册traceback (Runtime) - Python 中文开发手册该模块提供了一个标准接口来提取,格式化和打印Python程序的堆栈跟踪。它完全模仿Python解释器在打印堆栈跟踪时的行为。当您想要在程序控制下打印堆栈跟踪时,例如在解释器周围的“包装器”中,这很有用。模块使用跟踪对象 - 这是存储在变量sys.exc_traceback(不建议使用)和sys.last...

MacOS BigSur 在根目录下生成/data_绿叶上的露珠的博客-程序员秘密

MacOS BigSur 在根目录下生成/data最近刚换了Mac 由于项目中需要在/data/logs打印日志,但是发现MacOS Big Sur无法在根目录下创建data文件夹,查阅资料加以实践后终于得到解决,现分享给大家。解决方法如下:1、进入/System/Volumes/Data并创建data文件夹cd /System/Volumes/Datasudo mkdir datasudo chmod -R 777 /data2、打开synthetic.conf(没有就新建一个)并写入以下

随便推点

c语言编程求pai的近似值,c语言:求π的近似值_古明地幔的博客-程序员秘密

用公式π/4=1-1/3+1/5-1/7...求π的近似值,直到发现某一项的绝对值小于10^6为止(该项不累加)解:程序:#include#includeint main(){int sign = 1;double pi = 0.0, n = 1.0, term = 1.0;//term表示当前项while (fabs(term) >= 1e-6){pi += term;n += 2;sig...

MyEclipse设置代码提示功能_myeclipse提示框文字_知也无涯的博客-程序员秘密

写代码的时候为什么能给我们提示?你知道提示分为手动提示和自动提示么?今天我们就以MyEclipse为例讲一下MyEclipse手动提示和自动提示如何设置。在开始这篇博客之前,我们先来说一下代码的手动提示和自动提示。手动提示就是必须按某个快捷键出现提示内容;自动提示就是只要你敲代码就会自动出现提示内容。好了,有了这样一个前提,我们就开讲了。手动提示: MyEclipse是自带手动代码提示功能的,其默认键是Alt+/,但是有时候由于MyEclipse快捷键设置冲突的问题,导致了快捷键无法使用。所以

修改电脑按键_xiaoerbuyu1233的博客-程序员秘密

package test;import javax.swing.*;import javax.swing.border.EmptyBorder;import javax.swing.filechooser.FileSystemView;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event....

如何使用SetTimer MFC_ellor的博客-程序员秘密

  Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。           1、SetTimer定义在那里?            SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。SetTi

配置OpenSSL时候报nmake不是内部命令或外部命令解决方法_befreedomjustice的博客-程序员秘密

cmd到vc目录下,运行vcvarsall.bat,然后再cd到openssl目录nmake剪切 (Ctrl+X)复制 (Ctrl+C)粘贴 (Ctrl+V)粘贴文本段落标签字体字体大小加粗 (Ctrl+B)斜体 (Ctrl+I)下划线 (Ctrl+U)删除线字体颜色背景颜色删除文字格式对齐列表减少缩进增加缩进超链接 (Ctrl+L)取消超链接图

java 设计模式---单例模式_luxifa_chenxing的博客-程序员秘密

单例模式是在开发中运用叫多的设计模式了,以下为个人的粗略理解之所以称之为单例,是因为在系统中只有一个被实例化的对象。单例模式又包含懒汉式和饿汉式,其中懒汉式式线程不安全的,这里就不加赘述。实现单例模式的思路:1.实例化一个对象需要构造方法来进行实力化 例如 A a =new A();如果我们把构造方法加上private 关键字,那么这个构造方法在其他类中就不能够被使用即构造...