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)