【防忘筆記】卷積層輸入輸出大小計算
卷積輸出大小計算方法
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()類似
卷積操作輸入輸出數據形狀的計算方法
假設輸入是一個正方形,寬度與高度相等
那麼計算卷積輸出大小的公式是:
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)
同樣的,若輸出是方形張量,則計算轉置卷積輸出大小的公式是: