原文鏈接: https://zhuanlan.zhihu.com/p/29119239
卷積層尺寸的計(jì)算原理
- 輸入矩陣格式:四個(gè)維度闷袒,依次為:樣本數(shù)、圖像高度、圖像寬度奏篙、圖像通道數(shù)
- 輸出矩陣格式:與輸出矩陣的維度順序和含義相同,但是后三個(gè)維度(圖像高度鱼冀、圖像寬度报破、圖像通道數(shù))的尺寸發(fā)生變化。
- 權(quán)重矩陣(卷積核)格式:同樣是四個(gè)維度千绪,但維度的含義與上面兩者都不同充易,為:卷積核高度、卷積核寬度荸型、輸入通道數(shù)盹靴、輸出通道數(shù)(卷積核個(gè)數(shù))
- 輸入矩陣、權(quán)重矩陣、輸出矩陣這三者之間的相互決定關(guān)系
- 卷積核的輸入通道數(shù)(in depth)由輸入矩陣的通道數(shù)所決定稿静。(紅色標(biāo)注)
- 輸出矩陣的通道數(shù)(out depth)由卷積核的輸出通道數(shù)所決定梭冠。(綠色標(biāo)注)
-
輸出矩陣的高度和寬度(height, width)這兩個(gè)維度的尺寸由輸入矩陣、卷積核改备、掃描方式所共同決定控漠。計(jì)算公式如下。(藍(lán)色標(biāo)注)
- 注:以下計(jì)算演示均省略掉了 Bias 悬钳,嚴(yán)格來(lái)說(shuō)其實(shí)每個(gè)卷積核都還有一個(gè) Bias 參數(shù)盐捷。
標(biāo)準(zhǔn)卷積計(jì)算舉例
以 AlexNet 模型的第一個(gè)卷積層為例默勾,
- 輸入圖片的尺寸統(tǒng)一為 227 x 227 x 3 (高度 x 寬度 x 顏色通道數(shù))碉渡,
- 本層一共具有96個(gè)卷積核,
- 每個(gè)卷積核的尺寸都是 11 x 11 x 3母剥。
- 已知 stride = 4滞诺, padding = 0,
- 假設(shè) batch_size = 256环疼,
-
則輸出矩陣的高度/寬度為 (227 - 11) / 4 + 1 = 55
1 x 1 卷積計(jì)算舉例
后期 GoogLeNet习霹、ResNet 等經(jīng)典模型中普遍使用一個(gè)像素大小的卷積核作為降低參數(shù)復(fù)雜度的手段。
從下面的運(yùn)算可以看到秦爆,其實(shí) 1 x 1 卷積沒(méi)有什么神秘的序愚,其作用就是將輸入矩陣的通道數(shù)量縮減后輸出(512 降為 32),并保持它在寬度和高度維度上的尺寸(227 x 227)等限。
全連接層計(jì)算舉例
實(shí)際上爸吮,全連接層也可以被視為是一種極端情況的卷積層,其卷積核尺寸就是輸入矩陣尺寸望门,因此輸出矩陣的高度和寬度尺寸都是1形娇。
總結(jié)下來(lái),其實(shí)只需要認(rèn)識(shí)到筹误,雖然輸入的每一張圖像本身具有三個(gè)維度桐早,但是對(duì)于卷積核來(lái)講依然只是一個(gè)一維向量。卷積核做的厨剪,其實(shí)就是與感受野范圍內(nèi)的像素點(diǎn)進(jìn)行點(diǎn)積(而不是矩陣乘法)哄酝。
附:TensorFlow 中卷積層的簡(jiǎn)單實(shí)現(xiàn)
def conv_layer(x, out_channel, k_size, stride, padding):
in_channel = x.shape[3].value
w = tf.Variable(tf.truncated_normal([k_size, k_size, in_channel, out_channel], mean=0, stddev=stddev))
b = tf.Variable(tf.zeros(out_channel))
y = tf.nn.conv2d(x, filter=w, strides=[1, stride, stride, 1], padding=padding)
y = tf.nn.bias_add(y, b)
y = tf.nn.relu(y)
return x
輸入 x:[batch, height, width, in_channel]
權(quán)重 w:[height, width, in_channel, out_channel]
輸出 y:[batch, height, width, out_channel]
pytorch中的padding計(jì)算
How to keep the shape of input and output same when dilation conv?