卷积输出大小计算方法

tensorflow中的常用卷积操作API

正向卷积:Conv2D()

举例:

...
Conv2D(128, kernel_size=4, padding="same")
# 128个过滤器(128维),卷积核大小为4,边缘填充
# 注:此处步长为默认值1,此时使用padding="same",输出数据的形状会保持不变(与输入一致)
#    若步长不为1,则根据计算公式计算(后面会介绍)

升采样:UpSampling2D()

举例:

...
model.add(Reshape((7, 7, 128)))# Reshape成以下形状
model.add(UpSampling2D())# 上采样,对数据进行插值,形状变成之前的两倍
--->(None, 14, 14, 128)
...

pytorch中的常用卷积操作API

正向卷积:nn.Conv2d()

举例:

nn.Conv2d(256, 512, 4, stride=1, bias=False),
...
# 输入256通道,输出512通道,卷积核为4,步长为1
# 注:这里的"通道"指卷积操作之后得到的"特征图"的数量,而不是数据的形状
#    数据形状计算按照公式

转置卷积:nn.ConvTranspose2d()【对应tf的tf.nn.conv2d_transpose】

举例:

nn.ConvTranspose2d(256, 128, 4, stride=2, bias=False)
...
# 输入256通道,输出128通道,卷积核为4,步长为2,逻辑与Conv2d()类似

卷积操作输入输出数据形状的计算方法

假设输入是一个正方形,宽度与高度相等

那么计算卷积输出大小的公式是:

image-20220616191544008

L形括号的意义是取括号内数值的数学下限

例如:2.3 --> 2

例子:

# 输入形状是28,28,1
# 16个过滤器(16维),卷积核大小为3,步数2,边缘填充
        model.add(Conv2D(16, kernel_size=3, strides=2, input_shape=self.img_shape, padding="same"))
        model.add(LeakyReLU(alpha=0.2))
        model.add(Dropout(0.25))

        '''
        这里的输出需要计算
        [(14-3)+2]/2+1=6.5+1=6+1=7(下取整)
        因此,经过下面卷积层后,数据的形状为(None, 7, 7, 32)
        '''
        model.add(Conv2D(32, kernel_size=3, strides=2, padding="same"))# (None, 7, 7, 32)

同样的,若输出是方形张量,则计算转置卷积输出大小的公式是:

image-20220616191820831