Numpy的array数组和TensorFlow的tensor张量的padding操作(实质数组空间形状理解)

Numpy的array数组补0操作
#二维数组row=3,col=2(3,2)
data1 = np.array([[1,2],[3,4],[5,6]])
#补0模式,一维位置前后补(一层)0,二维位置前后补(一层)0
pad_width1 = ((1,1),(1,1))
data1_p = np.pad(data1, pad_width=pad_width1, mode='constant', constant_values=0)
print(data1_p)
>>>[[0 0 0 0]
 [0 1 2 0]
 [0 3 4 0]
 [0 5 6 0]
 [0 0 0 0]]
#更好理解可体现在索引的操作上面,在(3,2)索引上(3+2,2+2)=(5,4)
print(np.shape(data1_p))
>>>(5,4)

#三维数组heights=2,weights=2,channels=2
data2 = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print(np.shape(data2))
>>>(2,2,2)
print(data2)
>>>[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]

#分别在height,weights,channels的前后补(加一层)0
#直接看结果有点难理解,结合补0前后索引的变化和三维空间立方体更容易理解!
pad_width2 = ((1, 1), (0, 0),(0, 0))
data2_p = np.pad(data2, pad_width=pad_width2, mode='constant', constant_values=0)
print(np.shape(data2_p))
print(data2_p)
>>>(4, 2, 2)
>>>[[[0 0]
  [0 0]]

 [[1 2]
  [3 4]]

 [[5 6]
  [7 8]]

 [[0 0]
  [0 0]]]
pad_width3 = ((0, 0), (1, 1),(0, 0))
data3_p = np.pad(data2, pad_width=pad_width3, mode='constant', constant_values=0)
print(np.shape(data3_p)) 
print(data3_p)
>>>(2, 4, 2)
>>>[[[0 0]
  [1 2]
  [3 4]
  [0 0]]

 [[0 0]
  [5 6]
  [7 8]
  [0 0]]]

pad_width4 = ((0, 0), (0, 0),(1, 1))
data4_p = np.pad(data2, pad_width=pad_width4, mode='constant', constant_values=0)
print(np.shape(data4_p)) 
print(data4_p)
>>>(2, 2, 4)
>>>[[[0 1 2 0]
  [0 3 4 0]]

 [[0 5 6 0]
  [0 7 8 0]]]
重点理解比较下面两种padding位置的区别

data3 = np.array([[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]],
            [[[13,14,15], [16,17,18]],[[19,20,21], [22,23,24]]]])
print(np.shape(data3))
print(data3)
>>>(2, 2, 2, 3)
>>>[[[[ 1  2  3]
   [ 4  5  6]]

  [[ 7  8  9]
   [10 11 12]]]


 [[[13 14 15]
   [16 17 18]]

  [[19 20 21]
   [22 23 24]]]]

#height位置前后补(加一层)0,weight位置前后补(加一层)0,
pad_width5 = ((0, 0), (1, 1),(1, 1),(0, 0))
data5_p = np.pad(data3, pad_width=pad_width5, mode='constant', constant_values=0)
print(np.shape(data5_p))
print(data5_p)
>>>(2, 4, 4, 3)
>>>[[[[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 1  2  3]
   [ 4  5  6]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 7  8  9]
   [10 11 12]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]]


 [[[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]

  [[ 0  0  0]
   [13 14 15]
   [16 17 18]
   [ 0  0  0]]

  [[ 0  0  0]
   [19 20 21]
   [22 23 24]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]]]


data4 = np.array([[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],
            [[13,14,15], [16,17,18]],[[19,20,21], [22,23,24]]]])
print(np.shape(data4))
print(data4)
>>>(1, 4, 2, 3)
>>>[[[[ 1  2  3]
   [ 4  5  6]]

  [[ 7  8  9]
   [10 11 12]]

  [[13 14 15]
   [16 17 18]]

  [[19 20 21]
   [22 23 24]]]]

pad_width6 = ((0, 0), (1, 1),(1, 1),(0, 0))
              #height位置前后补(加一层)0,weight位置前后补(加一层)0,
data6_P = np.pad(data4, pad_width=pad_width6, mode='constant', constant_values=0)
print(np.shape(data6_P))
print(data6_P)
>>>(1, 6, 4, 3)
>>>[[[[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 1  2  3]
   [ 4  5  6]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 7  8  9]
   [10 11 12]
   [ 0  0  0]]

  [[ 0  0  0]
   [13 14 15]
   [16 17 18]
   [ 0  0  0]]

  [[ 0  0  0]
   [19 20 21]
   [22 23 24]
   [ 0  0  0]]

  [[ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]
   [ 0  0  0]]]]
#channel横切面channel = 0的位置
print((data3[:,:,:,0]))
>>>[[[ 0  0  0  0]
  [ 0  1  4  0]
  [ 0  7 10  0]
  [ 0 13 16  0]
  [ 0 19 22  0]
  [ 0  0  0  0]]]
0 0  0  0
0 1  4  0
0 7  10 0
0 13 16 0
0 19 23 0
0 0  0  0

#weight位置前后补(加一层)0,channel位置前后补(加一层)0,
pad_width7 = ((0, 0), (0, 0),(1, 1),(1, 1))
data7_P = np.pad(data4, pad_width=pad_width7, mode='constant', constant_values=0) print(np.shape(data6_P))
print(data7_P)
>>>(1, 4, 4, 5)
>>>[[[[ 0  0  0  0  0]
   [ 0  1  2  3  0]
   [ 0  4  5  6  0]
   [ 0  0  0  0  0]]

[[ 0  0  0  0  0]
   [ 0  7  8  9  0]
   [ 0 10 11 12  0]
   [ 0  0  0  0  0]]

[[ 0  0  0  0  0]
   [ 0 13 14 15  0]
   [ 0 16 17 18  0]
   [ 0  0  0  0  0]]

[[ 0  0  0  0  0]
   [ 0 19 20 21  0]
   [ 0 22 23 24  0]
   [ 0  0  0  0  0]]]]

你可能感兴趣的:(python,tensorflow)