【防忘筆記】卷積層輸入輸出大小計算

卷積輸出大小計算方法

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