文章目錄
- 前言
- 計算機視覺
- 邊緣檢測示例:
- 更多邊緣檢測内容:
- Padding
- 卷積步長
- 卷積為何有效
- 單層卷積網絡
- 簡單磁碟區積網絡示例
- 池化層
- 卷積神經網絡示例
- 為什麼使用卷積
前言
本篇文章是吳恩達《深度學習》課程《卷積神經網絡——第一周》的學習筆記。
計算機視覺
計算機視覺面臨的一個挑戰是圖像的資料量巨大。

上述圖檔是計算機視覺領域的典型應用:圖像分類、風格轉換、目标檢測。
如上圖所示,神經網絡第一層參數矩陣巨大,具有三十億個參數。在這種情況下,難以擷取足夠的資料來防止神經網絡發生過拟合和競争需求。要處理包含三十億參數的神經網絡,巨大的記憶體需求讓人不能接受。
邊緣檢測示例:
需要注意的兩個點
- filter過濾器在論文中有時也稱作kernel核。
- 在數學中,“*”就是卷積的标準标志,Python中表示乘法或者是元素乘法。
卷積神經網絡(CNN)學習筆記前言計算機視覺邊緣檢測示例:更多邊緣檢測内容:Padding卷積步長卷積為何有效單層卷積網絡簡單磁碟區積網絡示例池化層卷積神經網絡示例為什麼使用卷積 卷積神經網絡(CNN)學習筆記前言計算機視覺邊緣檢測示例:更多邊緣檢測内容:Padding卷積步長卷積為何有效單層卷積網絡簡單磁碟區積網絡示例池化層卷積神經網絡示例為什麼使用卷積 卷積神經網絡(CNN)學習筆記前言計算機視覺邊緣檢測示例:更多邊緣檢測内容:Padding卷積步長卷積為何有效單層卷積網絡簡單磁碟區積網絡示例池化層卷積神經網絡示例為什麼使用卷積
更多邊緣檢測内容:
Sobel filter的好處是增加了中間一行元素的權重,也就是處在圖像中間的像素點,這使得結果的魯棒性會更高一點。
Scharr filter也是垂直邊緣檢測濾波器,旋轉90度得到水準邊緣檢測器。
上圖下半部分顯示,把濾波器當成參數學習,也許勝過其他濾波器,能夠檢測多角度邊緣或者可以學習一些更低級的特征。
Padding
在沒有padding時,輸入圖像次元為 n ∗ n n*n n∗n,濾波器次元為 f ∗ f f*f f∗f,那麼輸出圖像次元為 ( n − f + 1 ) ∗ ( n − f + 1 ) (n-f+1)*(n-f+1) (n−f+1)∗(n−f+1)。缺點在于:每做一次卷積操作,圖像就會縮小。
另外,如上圖所示,原圖中在角落或者邊緣區域的像素點,在輸出中采用較少,也就是說filter很少觸碰到它們,意味着丢掉了圖像邊緣位置的資訊。
若邊緣填充像素個數表示成p,那麼輸出圖像的次元為 ( n + 2 p − f + 1 ) ∗ ( n + 2 p − f + 1 ) (n+2p-f+1)*(n+2p-f+1) (n+2p−f+1)∗(n+2p−f+1)。如上圖所示,在padding之後,左側填充綠色像素點的區域(原圖左上角像素)影響了右側填充綠色的像素點。這樣,角落或者邊緣區域像素點在輸出中采用較少的這一缺點就被削弱了。
選擇多少像素進行填充,通常由兩種方式,分别叫做Valid卷積和Same卷積,如下圖所示:
Valid卷積意味着不填充。
Same卷積意味着填充後你的輸出圖像的大小和輸入圖像的大小是一樣的。Same卷積中padding的大小 p = f − 1 2 p = \frac{f-1}{2} p=2f−1。當 f f f是奇數時, p p p正好是一個整數,并且在深度學習中, f f f通常都是奇數。
f f f通常為奇數的原因可能在于,一是這樣不必采用不對稱的填充,比如 f f f是偶數時左邊比右邊填充的多一點;第二個原因是當你有一個奇數維過濾器,它就有一個中心點,這樣便于指出過濾器的位置。
卷積步長
如上圖所示,假設輸入圖像為 n ∗ n n*n n∗n次元,filter次元為 f ∗ f f*f f∗f,padding大小為 p p p,stride步長為 s s s,那麼輸出圖像的次元為 ⌊ n + 2 p − f s + 1 ⌋ ∗ ⌊ n + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s} + 1 \rfloor * \lfloor \frac{n+2p-f}{s} + 1 \rfloor ⌊sn+2p−f+1⌋∗⌊sn+2p−f+1⌋。另外,當這裡的商不是整數時,我們選擇向下取整。如圖中所示的 z z z,這也被稱作對 z z z進行floor divide。也就是說不要将濾波器移出圖像的範圍。
如上圖所示,在數學中的卷積我們首先要将濾波器進行水準和垂直方向的翻轉然後再做深度學習概念中的卷積操作。技術上說,深度學習的卷積,有時被稱作互相關(cross-correlation)而不是卷積,但在深度學習文獻中,還是把它叫做卷積。另外,圖中右下角的結合律一般是在數學概念的卷積中進行應用,這對我們來說并不重要。
卷積為何有效
如下圖所示,輸入圖像的通道數必須和過濾器的通道數比對。
如下圖所示, 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3的濾波器在左側 6 ∗ 6 ∗ 3 6*6*3 6∗6∗3的原始圖像上移動,每層對應像素做乘積求和操作,再把對應三層的結果相加,即得到最右側的輸出。
使用 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3的濾波器可以使我們隻關心RGB其中某個通道,也可以使用它們全部的資訊,如圖中右下方所示。注意,最後的輸出圖像次元為 4 ∗ 4 ∗ 1 4*4*1 4∗4∗1。
如下圖所示,我們可以對一幅圖像使用多個濾波器。次元變化總結為圖像下方的公式:當步長為1,且沒有padding的時候,輸入圖像次元為 n ∗ n ∗ n c n*n*n_c n∗n∗nc,濾波器次元為 f ∗ f ∗ n c f*f*n_c f∗f∗nc,那麼輸出圖像為 ( n − f + 1 ) ∗ ( n − f + 1 ) ∗ n c ′ (n-f+1)*(n-f+1)*n_c' (n−f+1)∗(n−f+1)∗nc′,其中 n c ′ n_c' nc′為濾波器個數, n c n_c nc為輸入圖像通道數(在一些文獻中也稱為深度,為避免和神經網絡的深度混淆,吳恩達視訊中都用通道數來稱呼)。
單層卷積網絡
有幾個filter,就有幾個特征映射。
各變量的次元如下圖所示,注意右下角 A [ l ] A^{[l]} A[l]下的花括号表示有的文獻或代碼中會把圖像通道數放在高度和寬度之前。另外, A [ l ] A^{[l]} A[l]計算公式中的 m m m表示樣本個數。
簡單磁碟區積網絡示例
如下圖所示是一個簡單的神經網絡示例。像圖中一樣,卷積神經網絡實作一般有個趨勢是圖像的高和寬不斷減小,而深度不斷增加。圖中右下角是将 7 ∗ 7 ∗ 40 7*7*40 7∗7∗40的圖像展開成一個長向量,然後利用logistic或softmax激活得到最後的預測值 y ^ \hat y y^。
如下圖所示,一個典型的卷積神經網絡通常會包含三種層,卷積層、池化層、全連接配接層,括号裡是它們的簡寫。
池化層
卷積神經網絡通常也會使用池化層,來縮減模型的大小,提高計算速度,同時提高所提取特征的魯棒性。
如上圖所示是一個max pooling層,相當于有一個 f = 2 , s = 2 f = 2, s = 2 f=2,s=2的filter。最大化運算的實際作用是,如果在過濾器中提取到某個特征,那麼保留其最大值;如果沒有提取到這個特征,比如在上圖右上象限中就不存在這個特征,那麼其中的最大值也還是很小,這是對max pooling的直覺了解。
如上圖所示,池化層的超參數都是确定的,反向傳播過程中沒有什麼超參數可以學習。它的次元計算法則和卷積的次元計算是一緻的。
如上圖所示,是一個平均池化的例子,在神經網絡中,最大池化要用的比較多,平均池化用的比較少,除非是在比較深的網絡中,例如我們可以對 7 ∗ 7 ∗ 1000 7*7*1000 7∗7∗1000的圖像利用全局平均池化得到 1 ∗ 1 ∗ 1000 1*1*1000 1∗1∗1000的圖像。
如上圖所示,池化層常用的超參數一般是 f f f和 s s s,且常用的設定是 f = 2 , s = 2 f=2, s=2 f=2,s=2,這相當于輸入圖像的高和寬縮小了一半,并且一般我們是沒有padding超參數的,也就是p=0。pooling沒有參數需要學習。
卷積神經網絡示例
如上圖所示,是一個卷積神經網絡的示例。圖檔下方展示的是常用的卷積神經網絡結構,即重複卷積、池化,最後執行全連接配接和激活函數。
另外一點值得說明的是,吳恩達将一個卷積層和一個池化層合在一起稱作一個layer,根據是這裡隻有卷積層是有權重和參數,而池化層沒有。當然,有的文獻中也會把卷積層和池化層當做兩個layer。通常我們計算神經網絡的層時隻算入有權重和參數的層。
如上圖所示,是本節第一張圖中各層的參數數量(注意CONV1、POOL1的通道數和本節第一張圖有所出入)。
有幾點需要注意:
(1) 池化層沒有參數
(2) 卷積層的參數相對較少,大部分參數都存在于神經網絡的全連接配接層
(3) 随着神經網絡的加深,activation size會逐漸減小,但如果它下降太快,也會影響神經網絡的性能
為什麼使用卷積
如下圖所示,和隻用全連接配接層相比,卷積層的兩個主要優勢在于參數共享(parameter sharing)和稀疏連接配接(sparsity of connections)。
圖中下半部分表示,全連接配接層需要一千四百萬個參數,而卷積層(含偏置)隻需要156個參數(實際應該為5x5x3x6+6=456個參數,吳恩達沒有考慮filter的通道)。
如上圖所示,參數共享含義在于:如果一個特征檢測(例如垂直邊緣檢測)适用于圖檔的一個區域,那麼它很有可能也适用于圖檔的其他區域。
稀疏連接配接的含義在于:原圖中左上角的9個像素經過卷積後轉換為右側圖中左上角的一個值,原圖中除了那9個像素之外的其他像素不參與計算。也就是每個輸出值隻取決于一小部分的輸入。
卷積神經網絡通過這兩種機制使我們可以使用更小的訓練集訓練它,進而預防過拟合。
另外,卷積神經網絡善于捕捉平移不變(translation invariance),比如圖檔中的貓向右平移兩個像素,圖檔中的貓依然清晰可見。因為神經網絡的卷積結構,即使移動幾個像素,這張圖檔依然具有非常相似的特征,應該屬于同樣的輸出标記。實際上, 用同一個濾波器生成的各層中,圖檔的所有像素值,希望網絡通過自動學習變得更加健壯,以便更好地取得所期望的平移不變屬性。
卷積神經網絡的訓練如上圖所示,和普通的神經網絡一樣,我們可以設計自己的成本函數,然後使用梯度下降法來優化參數降低成本函數值。