[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.]]
可以看到差别。关于这个参数,还没看到太多介绍,还需要了解。
[TensorFlow]Tensor维度理解的更多相关文章
- pytorch tensor 维度理解.md
torch.randn torch.randn(*sizes, out=None) → Tensor(张量) 返回一个张量,包含了从标准正态分布(均值为0,方差为 1)中抽取一组随机数,形状由可变参数 ...
- tensorflow中的函数获取Tensor维度的两种方法:
获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...
- pytorch 中改变tensor维度的几种操作
具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...
- 对Tensorflow中tensor的理解
Tensor即张量,在tensorflow中所有的数据都通过张量流来传输,在看代码的时候,对张量的概念很不解,很容易和矩阵弄混,今天晚上查了点资料,并深入了解了一下,简单总结一下什么是张量的阶,以及张 ...
- tensor维度变换
维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一. 在详解维度变换的方法之前,这里先介绍一下View(视图)的概念.所谓Vi ...
- tensor 维度 问题。
tf.argmax takes two arguments: input and dimension. example: tf.argmx(arr, dimension = 1). or tf.arg ...
- 关于类型为numpy,TensorFlow.tensor,torch.tensor的shape变化以及相互转化
https://blog.csdn.net/zz2230633069/article/details/82669546 2018年09月12日 22:56:50 一只tobey 阅读数:727 1 ...
- 从维度理解dp问题
对于dp,我目前的理解就是,干成题目中的那件事需要作出若干次决策,然后你要取其中最优的结果,我们可以用深搜来递归地找最优解,然后我们来观察一下这个递归树的形状,如果它能从底往上直接递推的话,就不用递归 ...
- tensorflow tensor Flatten 张量扁平化,多通道转单通道数据
slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim) ...
随机推荐
- 使用 DryIoc 替换 Abp 的 DI 框架
一.背景 你说我 Castle Windsor 库用得好好的,为啥要大费周章的替换成 DryIoc 库呢?那就是性能,DryIoc 是一款优秀而且轻量级的 DI 框架,整个项目代码就两个文件,加起来代 ...
- .Net 环境下比较各种数据库插入操作的性能
1.简介 再说Windows的异步I/O操作前,先聊聊一些题外话,能帮助我们更好的理解异步I/O操作,常规的Web程序,当用户发起一次请求,当请求通过管道到达客户端的这个过程,会唤起一个线程池线程(后 ...
- 原生端与服务器通过sessionid实现session共享以及登录验证
注:原生端与服务器建立连接时产生的sessionid会变,跟上一次的不一样,为了保证sessionid一样,所以第一次服务器需要把sessionid返回给原生端,下一次与服务端会话时,原生端需要把这个 ...
- mysql 开发进阶篇系列 7 锁问题(innodb锁争用情况及锁模式)
1 .获取innodb行锁争用情况 1.1 通过检查innodb_row_lock状态变量来分析系统上的行锁的争夺情况 SHOW STATUS LIKE 'innodb_row_lock%' 通过in ...
- Android数据保存之SharedPreference
前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的.保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器.总之大部分的程序 ...
- ⑤早起的鸟儿有虫吃-JSTL核心标签库[收藏]
介绍 JSTL 全名为Java Server Pages Standard Tag Library(JSP Standard Tag Library),它的中文名称为JSP 标准标签函数库. Web ...
- C++—程序的内存分区
代码区 程序被操作系统加载到内存时,所有可执行的代码被加载到代码区,也叫代码段,存储程序的代码指令.程序运行时,这段区域数据不可被修改只可以被执行. 静态区 程序中的静态变量.全局变量存放在此 ...
- 【个人杂谈】MacBook Pro的使用心得
上个月刚买的MacBook Pro,苹果就发新版了.... 从apple香港官网入手了一台MacBook Pro,带到公司,用了差不多一个月吧,这里讲讲我对MacBook的看法吧. 先声明一下两点: ...
- 各个系统下ping IP+端口的方法
前言 做开发的人员,可能都会遇到网络的一些问题.这时一般都需要测试指定的网络是否能正常访问.通常在windows系统下,在cmd里直接用命令ping指定的IP或者域名就可以快速的知道这个地址是否是可以 ...
- zabbix分布式监控部署--技术流ken
前言 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix pr ...