tf.layers.conv2d_transpose 公式計算out_shape 計算輸出的尺寸

tf.layers.conv2d_transpose 如下圖所示,藍色爲輸入,綠色輸出,灰色爲卷積核,虛線網格爲0,所以也可以看作是補0之後的正常卷積

                 

tf.layers.conv2d_transpose(inputs=img, filters=16, kernel_size=(6, 6), strides=(2, 2), padding='valid')

參數:filters: 輸出的通道數

   kernel_size:卷積核的尺寸大小

   strides: 這個步長並不是卷積核的移動步長,strides-1 表示在輸入元素之間補0的數量,同時反捲積的步長一定爲1

   padding:和正常卷積也是相反的

觀察之後看到,補0 過程分爲兩個部分:元素之間和外輪廓

1 、當padding = ‘valid’時:

     元素之間補0:(input_size - 1)×(strides - 1)

     外輪廓補0:(kernel_size - 1)× 2

     output_size = (input_size  + (input_size - 1)×(strides - 1) +(kernel_size - 1)× 2 - kernel_size ) / 1 + 1

2、當padding = ‘same’時:

     output_size = input_size × strides

     他是通過調整外輪廓的補0 數量實現的,如果不夠,我個人覺得可能元素之間補0也會減少

 

img = np.random.randint(0, 255, (5, 16, 16, 32)).astype(np.float32)
img_t = tf.constant(img, tf.float32)

transpose_v = tf.layers.conv2d_transpose(inputs=img_t, filters=16, kernel_size=(6, 6), strides=(2, 2), padding='valid')
transpose_s = tf.layers.conv2d_transpose(inputs=img_t, filters=16, kernel_size=(6, 6), strides=(2, 2), padding='same')
print('valid 輸出尺寸:', transpose_v.shape)
print('same 輸出尺寸: ', transpose_s.shape)


valid 輸出尺寸: (5, 36, 36, 16)
same 輸出尺寸:  (5, 32, 32, 16)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章