4维度变换
Posted pengzhonglian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4维度变换相关的知识,希望对你有一定的参考价值。
1、shape,ndim 形状和维度
(1)View视图,图片在内存中以行优先进行存储
- [ b,28,28] :view1,b张图片,每张28行,28列,
- [b,28*28]:view2,每张图片作为一行,将每张图片的数据作为一个统一的数据,不知道数据的构成,所以仅靠这无法对图片复原,如果想要复原就需要保存原来的图片信息。
- [b,2,14*28]:view3,将图片分成上下两个部分
- [b,28,28,1]:view4,没有改变原来图片的content,只是多加了一个通道的维度
(2)reshape,只是改变图片的一种理解方式,即view,没有改变图片的content,也就是原照片中像素的个数
①简单使用
1 a = tf.random.normal([4,28,28,3]) #view1 2 print(a.shape,a.ndim) #(4, 28, 28, 3) 4 3 4 b1 = tf.reshape(a,[4,784,3]) #输入一种新的理解方式,即view2。这里只关注像素的个数, 5 print(b1.shape) #(4, 784, 3) 6 7 b2 = tf.reshape(a,[4,-1,3]) # -1会自动计算原图片的像素的个数28*28,等同于b1的[4,784,3] 8 print(b2.shape) #(4, 784, 3) 9 10 b3 = tf.reshape(a,[4,784*3]) #新的方式view3,隐藏了通道的信息 11 print(b3.shape) #(4, 2352) 12 13 b4 = tf.reshape(a,[4,-1]) # -1自动计算783*3,等同于b3的[4,783*3] 14 print(b4.shape) # (4, 2352)
②灵活运用
1 a = tf.random.normal([4,28,28,3]) #view1 2 print(a.shape,a.ndim) #(4, 28, 28, 3) 4 3 4 b1 = tf.reshape(tf.reshape(a,[4,-1]),[4,28,28,3]) #tf.reshape(a,[4,-1])将原图片改成[4,28*28*3],然后继续变成[4,28,28,3] 5 print(b1.shape) # (4, 28, 28, 3) 6 7 b2 = tf.reshape(tf.reshape(a,[4,-1]),[4,14,56,3]) 8 print(b2.shape) # (4, 14, 56, 3) 9 10 b3 = tf.reshape(tf.reshape(a,[4,-1]),[4,1,784,3]) 11 print(b3.shape) # (4, 1, 784, 3)
2、transpose 转置
1 a = tf.random.normal([4,3,2,1]) #view1 2 print(a.shape,a.ndim) #(4, 3, 2, 1) 4 3 4 b1 = tf.transpose(a) #默认全部转置 5 print(b1.shape) #(1, 2, 3, 4) 6 7 #如果希望只有某些维度进行转置,则需要指定参数,表示转换后的顺序号 8 b2 = tf.transpose(a,perm = [0,1,3,2]) 9 print(b2.shape) #(4, 3, 1, 2)
3、expand_dims/squeeze 拓展/减少维度
1 #增加维度 2 a = tf.random.normal([4,35,8]) 3 print(a.shape) #(4, 35, 8) 4 5 b1 = tf.expand_dims(a,axis=0) 6 print(b1.shape) #(1, 4, 35, 8) 7 8 b2 = tf.expand_dims(a,axis=3) 9 print(b2.shape) #(4, 35, 8, 1) 10 11 #减少维度,只能减掉shape = 1的维度 12 """ 13 如:[2,33,21,1] ——> [2,33,21] 14 [3,1,4,1,1] ——> [3,4] 15 """ 16 17 a = tf.zeros([1,2,1,1,3]) 18 print(a.shape) 19 20 b1 = tf.squeeze(a) #默认减去所有shape为1的维度 21 print(b1.shape) # (2, 3) 22 23 b2 = tf.squeeze(a,axis=[0,2]) #设定指定的维度 24 print(b2.shape) #(2, 1, 3)
4、broadcast_to 广播
张量在计算的时候,如果相应的维度的维数不够,需要对其进行扩张,tf.tile是在真实的数据上复制n次,而broadcasting只是维度扩张的一种手段,只对张量的某一个维度重复计算多次,没有真正的进行数据的复制。
1 # ①将b的维度自动进行扩张 2 a = tf.random.normal([4,32,32,3]) 3 print(a.shape) # (4, 32, 32, 3) 4 5 b = tf.random.normal([3]) 6 print(b.shape) #(3,) 7 8 c = a + b 9 print(c.shape) # (4, 32, 32, 3)
1 # ②维度转换,只能从低维度到高维度转换 2 a = tf.random.normal([4,1,1,1]) 3 print(a.shape) # [4,1,1,1] 4 5 #将b的维度扩张同a一样的维度 6 b = tf.broadcast_to(a,[4,32,32,3]) 7 print(b.shape) #(4, 32, 32, 3)
以上是关于4维度变换的主要内容,如果未能解决你的问题,请参考以下文章