卷积和反卷积中的output shape计算
Conv2D
1 | import tensorflow as tf |
上例中输入是(28,28,3)
的shape
。
我们在推算output shape
时要分两种情况:
padding="valid"
:output_shape= [(input_shape - filter_size)/strides + 1] * [(input_shape - filter_size)/strides + 1]
。如果strides
除不尽,则向下取整(取比该数小的那个整数)。所以y3
的shape
是13padding="same"
: 当padding="same"
时计算很简单,得到的output
的shape
一定是input_shape/strides
。所以当strides=1
时,输入和输出的shape
时相等的,比如上面的y2
。
如果需要更细节的原理可以参考博客。这篇文章讲的特别好!重点推荐。
Conv2DTranspose
1 | y1 = tf.keras.layers.Conv2DTranspose(2, 3, activation='relu', input_shape=input_shape[1:],padding="valid")(x) |
同样的总结下这个反卷积我们在推算output shape
时也是分两种情况:
1. padding="valid"
:
output_length = input_length * stride + max(filter_size - stride, 0)
2. padding="same"
:
output_shape=input_shape * strides
。当strides=1
时,输出shape
等于输入shape
当padding=valid
时的计算有点复杂。再细究一下的话,tensorflow
中Conv2DTranspose
还接受output_padding
这个参数。如果有这个参数的话(默认是None),可以参考tensorflow
官方文档给出的公式