[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

智能推荐

mac 更新10.11后,出现command not found的解决办法_Bonjour_James的博客-程序员秘密

更新新系统后,需要使用cocoapods,使用pod update时,出现command not found,在终端内运行如下名利即可:sudo gem install -n /usr/local/bin cocoapods如果在网络情况不好的情况下,安装过程中卡在pod instal或者pod update,可以使用如下命令:pod update --no-repo-update即可快速安装第三方

JDBC连接数据库出现Loading class `com.mysql.jdbc.Driver'. This is deprecated.问题的相关解决方法_钥匙在手中的博客-程序员秘密

使用JDBC连接MySQL时,出现以下错误(enummm,一个连接问题真的卡了好久~~):Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the...

一直使用Ubuntu,突然就打不开了?_ubuntu打不开_李七音的博客-程序员秘密

我也是今天早上遇到的问题,进到vmare里面突然变了脸一样了,别担心,大家点击 ‘打开虚拟机’ 然后会跳出然后,进入到Window系统里找到安转的Ubuntu后点击打开就行了本人的是window里面安装的Ubuntu系统好了,如果我的文章给你带来帮助就点个赞吧!...

python语句行从解释器提示符后第几列开始_人工智能学习第三章 编写第一个Python程序 及概念..._weixin_39718173的博客-程序员秘密

接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序。本章将会教你如何编写、保存与运行 Python 程序。通过 Python 来运行的你的程序有两种方法——使用交互式解释器提示符或直接运行一个源代码文件。我们将了解如何使用他们二者的功能。使用解释器提示符在你的操作系统中打开终端(Terminal)程序(正如我们先前在 安装 章节所讨论过的那样)然后通过输入 pyt...

springboot设置session超时时长_springboot设置session超时时间_一个优秀的颓废程序猿的博客-程序员秘密

对于session会有一个默认超时时长,大概30分钟左右,可以通过request.getSession().getMaxInactiveInterval()方法获得。对于springboot可以简单设置,设置方法:在启动类中加注解就可以,具体如下:@Bean  public EmbeddedServletContainerCustomizer containerCustomizer(){...

定义数组并赋值_定义一个数组并赋值__Lyang_的博客-程序员秘密

1.定义一个给定长度的字符数组:String[] sz=new String[5];2.定义一个给定长度的字符数组并对其进行初始化:String[] sz=new String[]{"1","2","3","4","5"};

随便推点

数据库系统概论SQL语句例题实战_例3.1--3.12_开朗的大蒜的博客-程序员秘密

这里我们开始用SQL Server 来进行课本上例题的练习,没有书?没关系,我这有PDF版的。百度网盘,提取码:cg8s 听课不停学,我们一起加油! л̵ʱªʱªʱª (ᕑᗢᓫา∗)习题我敲了出来,如有错误欢迎大家指出。没安装SQL Server的同学也不着急,可以看一下我之前的文章,感谢支持!首先,我们先创建一个数据库,名称就叫做Test吧:然后我们刷新数据库: &n...

结构体指针初始化问题_zhongyoubing的博客-程序员秘密

(1)结构体指针是否需要初始化struct student{char* name;int score;struct student* next;}stu,*stu1;stu.name=(char*)malloc(sizeof(char));  //1 结构体成员指针需要初始化strcpy(stu.name,"Jim");stu.scor=90;s

bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】_weixin_30613343的博客-程序员秘密

参考:https://www.cnblogs.com/lcf-2000/p/6789680.html这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/lcf-2000/p/5866170.html#3830447枚举最大值a[i],找到l[i],r[i]是左边最后一个比它大的和右边第一个比它大的,考虑贡献:p1:每次询问要先加上(r-l)*p1...

SVN的上传和下载_svn客户端可以设置自动上传_Share,Keep Life ^_^的博客-程序员秘密

1.Tortoise SVN安装SVN的下载地址:https://tortoisesvn.net/downloads.html,点击TortoiseSVN 1.12.0下载64位的SVN,同时下载下方的Chinese语言包,点Setup下载64位的。下载完成后,在桌面或者文件夹的空白地方等右键会看到如下所示,证明SVN安装成功,且显示是中文。2.上传文件桌面右键-->...

完全用Linux:半年来,Linux高效完成我所有的工作!(转贴)_superhackerzhang的博客-程序员秘密

                                       — 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务,打游戏,那么你不需要了解下面这些了。 我不是一个狂热的自由软件份子,虽然我

【模型部署二】C++使用onnxruntime对pix2pix的onnx模型进行推理_onnxruntime c++_努力的袁的博客-程序员秘密

文章目录1. 环境配置2. Pix2Pix的Onnx模型3. Onnx模型推理1. 环境配置VS2019/Ubuntu配置Onnxruntime、Opencv:https://blog.csdn.net/qq_44747572/article/details/121340735?spm=1001.2014.3001.5501Libtorch + vs 2019安装及配置:https://blog.csdn.net/qq_44747572/article/details/1215107392. P