介紹
目前存在許多的深度學習庫和平臺(如Tensorflow、Keras、Pytorch、Caffe或Theano),在這篇文章中,我將嘗試列出所有這些參數,以了解它們對計算時間、訓練參數數量和卷積輸出通道大小的影響。
輸入形狀:(3,7,7)-輸出形狀:(2,3,3)-K:(3,3)-P:(1,1)-S:(2,2)-D:(2 ,2)— G:1
這篇文章的各部分將根據以下參數進行劃分。這些參數可以在Conv2d模塊的Pytorch文檔中找到:
in_channels(int)—輸入圖像中的通道數out_channels(int)—卷積產生的通道數kernel_size(int或元組)—卷積核的大小stride(int或tuple,可選)—卷積的步長。默認值:1padding(int或tuple,可選)—在輸入的兩側都添加了零填充。默認值:0dilation(int或tuple,可選)—核元素之間的間距。默認值:1groups(int,可選)—從輸入通道到輸出通道的blocked connections數量。默認值:1bias(布爾值,可選)—如果為True,則將可學習的偏差添加到輸出中。默認:True最後,我們將根據參數和輸入通道的大小計算輸出通道的大小。
什麼是核?
簡單來說,通過應用Convolution product,核將從左到右,從上到下移動整個圖像。
輸入形狀:(1,9,9)-輸出形狀:(1,7,7)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
如果你還不熟悉濾波器和卷積矩陣,那麼我強烈建議你多花點時間來理解卷積核。它們是二維卷積層的核心。
可訓練參數和偏差
可訓練參數,簡稱「參數」,是神經網絡訓練時需要更新的所有參數。在Conv2d中,可訓練元素是組成核的值。對於3×3的卷積核,我們有3*3=9個可訓練的參數。
我們可以包含偏差,也可以不包含。偏差的作用將加到convolution product的總和上。這個偏差也是一個可訓練的 參數,它使3 x 3核的可訓練參數數量增加到了10。
輸入輸出通道數
輸入形狀:(1,7,7)-輸出形狀:(4,5,5)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
使用層的好處是能夠在同一時間執行類似的操作。換句話說,如果我們想要對一個輸入通道應用4個相同大小的不同的filters,那麼我們將有4個輸出通道。這些通道是4個不同的filters的結果。因此產生於4個不同的核。
在上一節中,我們看到了可訓練參數是構成卷積核的要素。因此參數的數量隨卷積核的數量線性增加。因此與所需輸出通道的數量成線性關係。還要注意,還要注意,計算時間也與輸入通道的大小成比例地變化,與內核的數量成比例地變化。
同樣的原理也適用於輸入通道的數量。讓我們考慮RGB編碼圖像的情況。這幅圖像有3個通道:紅色,藍色和綠色。我們可以決定在這3個通道上使用相同大小的filters來提取信息,以獲得4個新通道。
輸入形狀:(3,7,7)-輸出形狀:(4,5,5)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
每個輸出通道都是經過過濾的輸入通道的和。對於4個輸出通道和3個輸入通道,每個輸出通道都是3個經過過濾的輸入通道的和。換句話說,卷積層由4*3=12個卷積核組成。
需要注意的是,參數的數量和計算時間與輸出通道的數量成比例地變化。這是因為每個輸出通道都連結到不同於其他通道的核。輸入通道的數量也是如此。計算時間和參數數量成比例增長。
核大小
到目前為止,所有示例都給出了3 x 3大小的核。實際上,其大小的選擇完全取決於您。可以創建核心大小為1 * 1或19 * 19的卷積層。
輸入形狀:(3,7,9)-輸出形狀:(2,3,9)-K:(5,2)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
可以使用不同高度和寬度的核。在信號圖像分析中通常是這種情況。如果知道要掃描信號或聲音的圖像,那麼我們可能希望使用5 * 1大小的核。
最後,您會注意到所有大小均由奇數定義。定義均勻的核大小也是可以接受的,實際上,很少這樣做。通常,選擇奇數大小的核是因為在中心像素周圍存在對稱性。
由於卷積層的所有可訓練參數都在核中,因此參數的數量隨核的大小線性增長。計算時間也成比例地變化。
Strides
默認情況下,核從左到右,從下到上,從一個像素移動到另一個像素。但是這個動作也可以改變,通常用於對輸出通道進行下採樣。例如,當步長為(1,3)時,兩個數分別代表了垂直滑動和水平滑動步長值。這將產生水平下採樣3的輸出通道。
輸入形狀:(3,9,9)-輸出形狀:(2,7,3)-K:(3,3)-P:(0,0)-S:(1,3)-D:(1 ,1)— G:1
Strides對參數的數量沒有影響,但是計算時間在邏輯上隨Strides線性減少。
Padding
Padding定義在卷積濾波之前添加到輸入通道側面的像素數量。通常,padding像素設置為零。
輸入形狀:(2,7,7)-輸出形狀:(1,7,7)-K:(3,3)-P:(1,1)-S:(1,1)-D:(1 ,1)— G:1
當您希望輸出通道的大小與輸入通道的大小相等時,這是非常有用的。簡單來說,當核為3*3時,輸出通道的大小每邊少1。為了解決這個問題,我們可以使用padding 1。
因此,padding對參數的數量沒有影響,但是會產生與padding的大小成比例的額外計算時間。但是通常來說,與輸入通道的大小相比,padding通常足夠小,可以認為對計算時間沒有影響。
Dilation
默認值為1,對應的是卷積時輸入通道上的核的每個像素之間的偏移量。
輸入形狀:(2,7,7)-輸出形狀:(1,1,5)-K:(3,3)-P:(1,1)-S:(1,1)-D:(4 ,2)— G:1
如果我們以(4,2)的Dilation為例,那麼輸入通道上核的感受野會在垂直方向上擴大了4 *(3 -1)= 8,水平方向是2 * (3–1)=4 (對於3乘3的核)。
就像padding一樣,Dilation對參數的數量沒有影響,對計算時間的影響非常有限。
Groups
在特定的情況下,Groups是非常有用的。例如,如果我們有幾個連接的數據源,當沒有相互依賴的時候,輸入通道可以獨立分組。最後,輸出通道在最後連接起來。
如果有2個輸入通道和4個輸出通道,有2組。這就像把輸入通道分成兩組(每組一個輸入通道),然後使其經過卷積層,而卷積層的輸出通道數是原來的一半。然後將輸出通道連接起來。
輸入形狀:(2,7,7)-輸出形狀:(4,5,5)-K:(3,3)-P:(2,2)-S:(2,2)-D:(1 ,1)— G:2
重要的是要注意兩件事。首先,組的數量必須能整除輸入通道數和輸出通道數(公約數)。其次,每個組共享核。
對於Pytorch的計算時間,該算法針對組進行了優化,因此可以減少計算時間。但是,還應考慮必須用於組形成和連接輸出通道的計算時間。
輸出通道大小
在知道所有參數的情況下,可以根據輸入通道的大小計算輸出通道的大小。