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)