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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

学界 | 谷歌大脑提出对抗正则化方法,显著改善自编码器的泛化和表征学习能力

无监督学习的目标之一是不依靠显式的标注得到数据集的内在结构。自编码器是一种用于达成该目标的常见结构,它学习如何将数据点映射到隐编码中——利用它以最小的信息损失来...

912
来自专栏程序生活

机器学习(六)Sigmoid函数和Softmax函数1 Sigmoid函数2 Softmax函数

1 Sigmoid函数 1.1 定义 Sigmoid函数是一个在生物学中常见的S型的函数,也称为S型生长曲线。Sigmoid函数常被用作神经网络的阈值函数,将变...

5.2K5
来自专栏机器学习算法工程师

简单易懂的自动编码器

作者:叶虎 编辑:田旭 引言 自动编码器是一种无监督的神经网络模型,它可以学习到输入数据的隐含特征,这称为编码(coding),同时用学习到的新特征可以重构出原...

5066
来自专栏AI研习社

完全图解RNN、RNN变体、Seq2Seq、Attention机制

本文主要是利用图片的形式,详细地介绍了经典的RNN、RNN几个重要变体,以及Seq2Seq模型、Attention机制。希望这篇文章能够提供一个全新的视角,帮助...

4475
来自专栏C语言及其他语言

【优秀题解】1175:台球碰撞

题号1174,原题见下图: ? 解题思路: 解题思路: 把台球看做质点(台球坐标不变,球桌坐标各个边界向里收缩R,得到新的球桌); 假设没边界,求出小球沿着直...

2916
来自专栏量子位

自编码器是什么?有什么用?这里有一份入门指南(附代码)

? 自编码器(Autoencoder,AE),是一种利用反向传播算法使得输出值等于输入值的神经网络,它先将输入压缩成潜在空间表征,然后通过这种表征来重构输出。...

3366
来自专栏AI研习社

手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类

编者按:本文源自一位数据科学开发者的个人博客,主要面对初学者用户,AI 研习社编译。另外,关于 TensorFlow 和 DNN 的更多深度内容,欢迎大家在文末...

3959
来自专栏文武兼修ing——机器学习与IC设计

PyTorch60分钟教程学习笔记基本概念网络构建分类网络搭建,训练与测试

基本概念 Tensor tensor是的含义是张量,简单的理解可以将其当成三维矩阵,pytorch中的张量是对数据的一种封装,也是数据结构中最核心的部分之一。对...

4176
来自专栏机器之心

教程 | 简述表征句子的3种无监督深度学习方法

选自Medium 作者:yonatan hadar 机器之心编译 参与:Nurhachu Null、路 本文介绍了三种用于表征句子的无监督深度学习方法:自编码器...

5285
来自专栏杨熹的专栏

seq2seq 入门

本文结构: 什么是 seq2seq? Encoder–Decoder 结构? seq2seq 结构? ---- 什么是 seq2seq? seq2seq 是一个...

3514

扫码关注云+社区

领取腾讯云代金券