0
点赞
收藏
分享

微信扫一扫

Tensor维度变换与Broadcasting

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、reshape

import tensorflow as tf

a = tf.random.normal([4, 28, 28, 3])
print(a.shape, "\t", a.ndim)
print(tf.reshape(a, [4, 784, 3]).shape)

需要注意的是,转换后的各个维度上的数值乘积要和reshape前相等
在这里插入图片描述

  • 如果一个张量的是很高维的,合并后的维度数值不好计算,可以用-1代替,系统会自动计算,但是-1只能出现一次
b = tf.random.normal([12, 20, 45, 10, 16])
print(tf.reshape(b, [12, -1, 16]).shape)

在这里插入图片描述


二、transpose

其功能类似于矩阵转置,若是多维张量,则是维度倒置。并且还可以用参数perm指定任意维度间的转换。

代码如下(示例):

c = tf.random.normal([4, 5, 8, 2])
#默认情况是倒置 输出为:【2854print(tf.transpose(c).shape)
#若有perm,则表示:转换后的索引0维度是原来索引为2的维度,
#1号维度是之前0号维度,2号维度是之前的3号维度,3号维度是之前的1号维度
#所以输出为【8425print(tf.transpose(c, perm=[2, 0, 3, 1]).shape)

在这里插入图片描述


三、squeeze

给定一个张量,squeeze可以去除那些数值为1的维度 例如:【4,28,1,3,1】——>【4,28,3】
当然也可以给定axis值,用于指定去除某一特定维度,这里的索引仍然可以用负数表示,需要注意:用axis指定坐标轴时,该坐标轴上的数值必须为1

代码如下(示例):

e = tf.random.normal([1, 3, 2, 1, 1, 6])
print(tf.squeeze(e).shape)            #默认情况下去除所有1的坐标轴
print(tf.squeeze(e, axis=3).shape)    #去除索引为3的坐标轴
print(tf.squeeze(e, axis=-2).shape)   #去除倒数第2个坐标轴
print(tf.squeeze(e, axis=-1).shape)   #倒数第1个坐标轴为6,不能去除,会报错

在这里插入图片描述


四、expand_dims

扩充维度,可指定在哪个维度之间增加维度
代码如下(示例):

d = tf.random.normal([4, 8, 2])
print(tf.expand_dims(d, axis=1).shape)
print(tf.expand_dims(d, axis=0).shape)
print(tf.expand_dims(d, axis=3).shape)
print(tf.expand_dims(d, axis=-1).shape)

axis给定的值为正数时代表的含义是:再该索引前添加一个维度,并且初始化为1
axis给定的值为负数时代表的含义是:默认最后一个维度索引可以用-1表示,再该索引后添加一个维度,并且初始化为1
在这里插入图片描述


五、Broadcasting

Broadcasting是一种自带的默认机制,方便两个不同维度的张量进行相加运算。eg:a是一个【4,28,28,3】的一个张量,b是一个【3】的张量(其实也就是个向量),当做a+b运算时,

  1. 那么Broadcasting机制就会自动将维度少的那个张量自动向右对齐维度多的张量,然后填充维度至相同维度。【3】——>【1,1,1,3】
  2. 扩充至相同维度后,再将扩充的维度分别扩展到相同大小【1,1,1,3】——>【4,28,28,3】
  3. 如果经过前两步后,能变成shape一样的两个张量后,那么就可以进行加运算了
  4. 举一个反例,【2】就不能和【4,28,28,3】相加
  5. 需要注意的是,Broadcasting机制并不会真正的改变一个张量的数据,就像上面的b仍然是【3】
举报

相关推荐

0 条评论