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)
发布了6 篇原创文章 · 获赞 22 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wh1319501722/article/details/90312939