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)
posted on 2019-11-21 19:37  Luaser  阅读(654)  评论(0编辑  收藏  举报