[TensorFlow]Tensor维度理解

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.]]

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

时间: 2024-08-28 21:30:36

[TensorFlow]Tensor维度理解的相关文章

tensor维度变换

维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓View,简单的可以理解成我们对一个tensor不同维度关系的认识.举个例子,一个[ b,28,28,1 ]的tensor(可以理解为mnist数据集的一组图片),对于这样一组图片,我们可以有一下几种理解方式: (1)按照物理设备储存结构,即一整行的方式(28*28)储存,这一行有连续的784个数据,这

AI - TensorFlow Tensor

张量(Tensor) 在Tensorflow中,变量统一称作张量(Tensor). 张量(Tensor)是任意维度的数组. 0阶张量:纯量或标量 (scalar), 也就是一个数值,例如,\'Howdy\' 或 5 1阶张量:向量 (vector)或矢量,也就是一维数组(一组有序排列的数),例如,[2, 3, 5, 7, 11] 或 [5] 2阶张量:矩阵 (matrix),也就是二维数组(有序排列的向量),例如,[[3.1, 8.2, 5.9][4.3, -2.7, 6.5]] 3阶张量:三维

关于类型为numpy,TensorFlow.tensor,torch.tensor的shape变化以及相互转化

https://blog.csdn.net/zz2230633069/article/details/82669546 2018年09月12日 22:56:50 一只tobey 阅读数:727 1.numpy类型:numpy.ndarray  对于图片读取之后(H,W,C)或者(batch,H,W,C) (1)在元素总数不变的情况下:numpy类型的可以直接使用方法numpy.reshape任意改变大小,numpy.expand_dims增加维度,大小是1(这个函数可以参考numpy.expan

tensorflow 中 reduce_sum 理解

定义如下: reduce_sum( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None ) reduce_sum 是 tensor 内部求和的工具.其参数中: 1. input_tensor 是要求和的 tensor 2. axis 是要求和的 rank,如果为 none,则表示所有 rank 都要仇和 3. keep_dims 求和后是否要降维 4. 这个操作的名称,可能在 graph 中 用

TensorFlow tensor张量拼接concat & stack

TensorFlow提供两种类型的拼接: tf.concat(values, axis, name='concat'):按照指定的已经存在的轴进行拼接 tf.stack(values, axis=0, name='stack'):按照指定的新建的轴进行拼接 concat t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 0) ==> [[1, 2, 3], [4, 5, 6], [7, 8

架构师维度理解 程序=数据+算法

程序=数据+算法 可以用更简单的话说: 程序= 数据+行为. 数据:  数据的组织,1对1,1对多. 复杂的程序要=N 个程序有序组织=N 个(数据+行为) 核心:           1 .对数据的认知和拆分. 2.对行为的组织. (从效率角度扩大支撑模块的外延,将支撑模块外延成业务模块,或者分层两层. 存储层+业务层. 费用模块是个很典型的案例) 一开始费用模块只是存储用,对外支撑使用. 后来新增一个费用项目.所有流程都要变更,上线,或者说通知. 后来干脆将这个支撑模块外延.

tensor的维度扩张的手段--Broadcasting

broadcasting是tensorflow中tensor维度扩张的最常用的手段,指对某一个维度上重复N多次,虽然它呈现数据已被扩张,但不会复制数据. 可以这样理解,对 [b,784]@[784,10]+[10]这样一个操作([10]可以理解为偏置项),那么原式可以化为[b,10]+[10],但是[b,10]和[10]这两个tensor是不能直接相加的,两者必须化为相一致维度的单元才能相加,即,把[10]扩张为[b,10],两者才能相加,而broadcasting做的就是这样一件事. 如果上面

【转】机器学习教程 十四-利用tensorflow做手写数字识别

模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基于tensorflow来介绍和演示 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址 什么是tensorflow tensor意思是张量,flow是流. 张量原本是力学里的术语,表示弹性介质中各点应力状态.在数学中,张量表示的是一种广义的"数量",0阶张量

使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 GPU 学习深度学习>系列文章的第二篇,主要介绍了 Tensorflow 的原理,以及如何用最简单的Python代码进行功能实现.本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主. 往期内容: 使用腾讯云 GPU 学习深度学习系列之一:传统机器学