卷积神经网络(CNN)原理
學習目標
- 目標
- 了解卷積神經網絡的構成
- 記憶卷積的原理以及計算過程
- 了解池化的作用以及計算過程
- 應用
- 無
3.2.1 卷積神經網絡的組成
- 定義
- 卷積神經網絡由一個或多個卷積層、池化層以及全連接層等組成。與其他深度學習結構相比,卷積神經網絡在圖像等方面能夠給出更好的結果。這一模型也可以使用反向傳播算法進行訓練。相比較其他淺層或深度神經網絡,卷積神經網絡需要考量的參數更少,使之成為一種頗具吸引力的深度學習結構。
我們來看一下卷積網絡的整體結構什么樣子。
?
其中包含了幾個主要結構
- 卷積層(Convolutions)
- 池化層(Subsampling)
- 全連接層(Full connection)
- 激活函數
3.2.2 卷積層
- 目的
- 卷積運算的目的是提取輸入的不同特征,某些卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網路能從低級特征中迭代提取更復雜的特征。
- 參數:
- size:卷積核/過濾器大小,選擇有1?1, 3?3, 5 * 5
- padding:零填充,Valid 與Same
- stride:步長,通常默認為1
- 計算公式
?
3.2.2.1 卷積運算過程
對于之前介紹的卷積運算過程,我們用一張動圖來表示更好理解些。一下計算中,假設圖片長寬相等,設為N
- 一個步長,3 X 3 卷積核運算
假設是一張5 X 5 的單通道圖片,通過使用3 X 3 大小的卷積核運算得到一個 3 X 3大小的運算結果(圖片像素數值僅供參考)
?
我們會發現進行卷積之后的圖片變小了,假設N為圖片大小,F為卷積核大小
相當于N - F + 1 = 5 - 3 + 1 = 3N?F+1=5?3+1=3
如果我們換一個卷積核大小或者加入很多層卷積之后,圖像可能最后就變成了1 X 1 大小,這不是我們希望看到的結果。并且對于原始圖片當中的邊緣像素來說,只計算了一遍,二對于中間的像素會有很多次過濾器與之計算,這樣導致對邊緣信息的丟失。
- 缺點
- 圖像變小
- 邊緣信息丟失
3.2.3 padding-零填充
零填充:在圖片像素的最外層加上若干層0值,若一層,記做p =1。
- 為什么增加的是0?
因為0在權重乘積和運算中對最終結果不造成影響,也就避免了圖片增加了額外的干擾信息。
?
這張圖中,還是移動一個像素,并且外面增加了一層0。那么最終計算結果我們可以這樣用公式來計算:
5 + 2 * p - 3 + 1 = 55+2?p?3+1=5
P為1,那么最終特征結果為5。實際上我們可以填充更多的像素,假設為2層,則
5 + 2 * 2 - 3 + 1 = 75+2?2?3+1=7,這樣得到的觀察特征大小比之前圖片大小還大。所以我們對于零填充會有一些選擇,該填充多少?
3.2.3.1 Valid and Same卷積
有兩種兩種形式,所以為了避免上述情況,大家選擇都是Same這種填充卷積計算方式
- Valid :不填充,也就是最終大小為
- (N - F + 1) * (N - F + 1)(N?F+1)?(N?F+1)
- Same:輸出大小與原圖大小一致,那么?NN變成了N + 2PN+2P
- (N + 2P - F + 1) * (N + 2P - F + 1)(N+2P?F+1)?(N+2P?F+1)
那也就意味著,之前大小與之后的大小一樣,得出下面的等式
(N + 2P - F + 1) = N(N+2P?F+1)=N
P = \frac{F -1}{2}P=?2??F?1??
所以當知道了卷積核的大小之后,就可以得出要填充多少層像素。
3.2.3.2 奇數維度的過濾器
通過上面的式子,如果F不是奇數而是偶數個,那么最終計算結果不是一個整數,造成0.5,1.5.....這種情況,這樣填充不均勻,所以也就是為什么卷積核默認都去使用奇數維度大小
-
1?1,3?3, 5?5,7?7
-
另一個解釋角度
- 奇數維度的過濾器有中心,便于指出過濾器的位置
當然這個都是一些假設的原因,最終原因還是在F對于計算結果的影響。所以通常選擇奇數維度的過濾器,是大家約定成俗的結果,可能也是基于大量實驗奇數能得出更好的結果。
3.2.4 stride-步長
以上例子中我們看到的都是每次移動一個像素步長的結果,如果將這個步長修改為2,3,那結果如何?
?
這樣如果以原來的計算公式,那么結果
N + 2P - F + 1 = 6 + 0 -3 +1 = 4N+2P?F+1=6+0?3+1=4
但是移動2個像素才得出一個結果,所以公式變為
\frac{N + 2P - F}{2} + 1 = 1.5 + 1 = 2.5?2??N+2P?F??+1=1.5+1=2.5,如果相除不是整數的時候,向下取整,為2。這里并沒有加上零填充。
所以最終的公式就為:
對于輸入圖片大小為N,過濾器大小為F,步長為S,零填充為P,
(\frac{N + 2P - F}{S} + 1),(\frac{N + 2P - F}{S} + 1)(?S??N+2P?F??+1),(?S??N+2P?F??+1)
3.2.5 多通道卷積
當輸入有多個通道(channel)時(例如圖片可以有 RGB 三個通道),卷積核需要擁有相同的channel數,每個卷積核 channel 與輸入層的對應 channel 進行卷積,將每個 channel 的卷積結果按位相加得到最終的 Feature Map。
?
3.2.5.1 多卷積核
當有多個卷積核時,可以學習到多種不同的特征,對應產生包含多個 channel 的 Feature Map, 例如上圖有兩個 filter,所以 output 有兩個 channel。這里的多少個卷積核也可理解為多少個神經元。
?
相當于我們把多個功能的卷積核的計算結果放在一起,比如水平邊緣檢測和垂直邊緣檢測器。
3.2.6 卷積總結
我們來通過一個例子看一下結算結果,以及參數的計算
- 假設我們有10 個Filter,每個Filter3 X 3 X 3(計算RGB圖片),并且只有一層卷積,那么參數有多少?
計算:每個Filter參數個數為:3?3?3 + 1 bias = 28個權重參數,總共28 * 10 = 280個參數,即使圖片任意大小,我們這層的參數也就這么多。
- 假設一張200?200?3的圖片,進行剛才的FIlter,步長為1,最終為了保證最后輸出的大小為200 * 200,需要設置多大的零填充
(\frac{N + 2P - F}{s} + 1) = N(?s??N+2P?F??+1)=N
P = \frac{(N -1) * s + F - N}{2} = \frac{199 + 3 - 200}{2} = 1P=?2??(N?1)?s+F?N??=?2??199+3?200??=1
3.2.6.1 設計單個卷積Filter的計算公式
假設神經網絡某層ll的輸入:
- inputs:?n_{h}^{[l -1]},n_{w}^{[l -1]},n_{c}^{[l -1]}n?h?[l?1]??,n?w?[l?1]??,n?c?[l?1]??
- 卷積層參數設置:
- f^{[l]}f?[l]??:filter的大小
- p^{[l]}p?[l]??:padding的大小
- s^{[l]}s?[l]??:stride大小
- n_{c}^{[l]}n?c?[l]??:filter的總數量
- outputs:n_{h}^{[l]},n_{w}^{[l]},n_{c}^{[l]}n?h?[l]??,n?w?[l]??,n?c?[l]??
所以通用的表示每一層:
- 每個Filter:f^{[l]} * f^{[l]} * n_{c}^{[l -1]}f?[l]???f?[l]???n?c?[l?1]??
- 權重Weights:f^{[l]} * f^{[l]} * n_{c}^{[l -1]} * n_{c}^{[l]}f?[l]???f?[l]???n?c?[l?1]???n?c?[l]??
- 應用激活函數Activations:a^{[l]} = n_{h}^{[l]},n_{w}^{[l]},n_{c}^{[l]}a?[l]??=n?h?[l]??,n?w?[l]??,n?c?[l]??
- 偏差bias:1 * 1 * 1 * n_{c}^{[l]}1?1?1?n?c?[l]??,通常會用4維度來表示
之前的式子我們就可以簡化成,假設多個樣本編程向量的形式
Z^{[l]} = W^{[l]} * X^{[l-1]} + b^{[l]}Z?[l]??=W?[l]???X?[l?1]??+b?[l]??
A^{[l]} = g(Z^{[l]})A?[l]??=g(Z?[l]??)
3.2.7 池化層(Pooling)
池化層主要對卷積層學習到的特征圖進行亞采樣(subsampling)處理,主要由兩種
- 最大池化:Max Pooling,取窗口內的最大值作為輸出
- 平均池化:Avg Pooling,取窗口內的所有值的均值作為輸出
意義在于:
- 降低了后續網絡層的輸入維度,縮減模型大小,提高計算速度
- 提高了Feature Map 的魯棒性,防止過擬合
?
對于一個輸入的圖片,我們使用一個區域大小為2?2,步長為2的參數進行求最大值操作。同樣池化也有一組參數,f, sf,s,得到2?2的大小。當然如果我們調整這個超參數,比如說3 * 3,那么結果就不一樣了,通常選擇默認都是f = 2 * 2, s = 2f=2?2,s=2
池化超參數特點:不需要進行學習,不像卷積通過梯度下降進行更新。
如果是平均池化則:
?
3.2.8 全連接層
卷積層+激活層+池化層可以看成是CNN的特征學習/特征提取層,而學習到的特征(Feature Map)最終應用于模型任務(分類、回歸):
- 先對所有 Feature Map 進行扁平化(flatten, 即 reshape 成 1 x N 向量)
- 再接一個或多個全連接層,進行模型學習
?
3.2.9 總結
- 掌握卷積神經網路的組成
- 掌握卷積的計算過程
- 卷積過濾器個數
- 卷積過濾器大小
- 卷積過濾器步數
- 卷積過濾器零填充
- 掌握池化的計算過程原理
總結
以上是生活随笔為你收集整理的卷积神经网络(CNN)原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS Code配置PHP XDebug
- 下一篇: 经典分类网络结构