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

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

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

  1. pytorch tensor 维度理解.md

    torch.randn torch.randn(*sizes, out=None) → Tensor(张量) 返回一个张量,包含了从标准正态分布(均值为0,方差为 1)中抽取一组随机数,形状由可变参数 ...

  2. tensorflow中的函数获取Tensor维度的两种方法:

    获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...

  3. pytorch 中改变tensor维度的几种操作

    具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...

  4. 对Tensorflow中tensor的理解

    Tensor即张量,在tensorflow中所有的数据都通过张量流来传输,在看代码的时候,对张量的概念很不解,很容易和矩阵弄混,今天晚上查了点资料,并深入了解了一下,简单总结一下什么是张量的阶,以及张 ...

  5. tensor维度变换

    维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓Vi ...

  6. tensor 维度 问题。

    tf.argmax takes two arguments: input and dimension. example: tf.argmx(arr, dimension = 1). or tf.arg ...

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

    https://blog.csdn.net/zz2230633069/article/details/82669546 2018年09月12日 22:56:50 一只tobey 阅读数:727   1 ...

  8. 从维度理解dp问题

    对于dp,我目前的理解就是,干成题目中的那件事需要作出若干次决策,然后你要取其中最优的结果,我们可以用深搜来递归地找最优解,然后我们来观察一下这个递归树的形状,如果它能从底往上直接递推的话,就不用递归 ...

  9. tensorflow tensor Flatten 张量扁平化,多通道转单通道数据

    slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim)  ...

随机推荐

  1. ionic3 ionic serve build fail Error: webpackJsonP is not defined

    ionic升级后发现 ionic serve 跑起来项目出现一下错误: Runtime Error: webpackJsonP is not definedStack: @http://localho ...

  2. Salesforce Sales Cloud 零基础学习(二) Account 和 Contact

    上一篇我们讲了Sales Cloud 中关于一个公司的产品和定价手册的概念,产品需要卖给企业客户(包括渠道伙伴以及合作伙伴等等)或者是个人客户,那客户信息存在哪里?针对企业客户,通过谁去串联起和企业客 ...

  3. 精读《dob - 框架使用》

    本系列分三部曲:<框架实现> <框架使用> 与 <跳出框架看哲学>,这三篇是我对数据流阶段性的总结,正好补充之前过时的文章. 本篇是 <框架使用>. 1 ...

  4. Core2.0知识整理

    概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...

  5. jvm详情——7、jvm调优基本配置、方案

    堆设置 -Xmn:设置年轻代大小   (整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般 固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推 ...

  6. python datetime模块详解

    datetime是python当中比较常用的时间模块,用于获取时间,时间类型之间转化等,下文介绍两个实用类. 一.datetime.datetime类: datetime.datetime.now() ...

  7. MyEclipse2017破解设置与maven项目搭建

    下载 版本:MyEclipse2017 Stable 2.0 百度网盘链接:https://pan.baidu.com/s/1vpIMKq9FfMMbhXzkmft_8A 密码:xfbv myecli ...

  8. [转]Javascript中几种较为流行的继承方式

    出处:http://www.jianshu.com/p/a6c005228a75 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascrip ...

  9. 分享几个实用的Chrome扩展程序

    前言 吐槽一下自己,最近变懒了,博客已经变成月更了.这次分享几个自己工作这几年下来,平常用的比较多的几个谷歌浏览器的扩展程序. AdBlock 最受欢迎的 Chrome 扩展,拥有超过 6000 万用 ...

  10. Perl基础速成

    本文是针对没有Perl基础,但想用perl一行式命令取代grep/awk/sed的人,用于速学Perl基础知识. Perl一行式系列文章:Perl一行式程序 perl的-e选项 perl命令的-e选项 ...