卷積神經網絡一般用在圖像處理、計算機視覺等領域。下面1-4節介紹了構造卷積神經網絡基礎知識,第5節介紹一些經典的卷積神經網絡,7-9節介紹了三種CNN常見應用:目標檢測、人臉識別、風格遷移。
1. 卷積計算
1.1 卷積運算 (Convolution):
如圖,一個6×6的矩陣A與一個3×3的filter矩陣進行卷積計算,生成了一個4×4的矩陣B,B[1][1]就是矩陣A紅色邊框中的數字與filter矩陣依次相乘再相加計算出來的,滑動邊框依次計算就可以得到B。
濾波器大小一般是奇數,例如3×3、5×5等,這樣就會有一個中心點,便於計算。
注意:在一些數學書籍上,卷積需要對濾波器進行鏡像操作,沒有鏡像操作的運算稱為“互相關”。但在深度學習文獻中,卷積一般沒有鏡像操作。
1.2 邊緣檢測 (Vertical edge detection):
下面展示了一個垂直濾波器(vertical filters)的效果 ,可以檢測出垂直的邊緣,還可以反映由明到暗或由暗到明的變化。
濾波器的大小、參數可以根據需要設計,例如還可以實現不同角度的邊緣檢測。在神經網絡中,參數可以通過訓練得出。
1.3 填充 (Padding):
在卷積計算中,矩陣大小變化為:( n × n ) * ( f × f ) = ( n-f+1 × n-f+1 )。這樣的計算存在兩個問題:(1) 輸出縮小,隨着網絡的加深,圖片經過多次卷積處理會越來越小;(2) 圖像邊緣的大部分信息丟失,例如左上角的元素只使用過一次。所以我們需要填充一層像素,使( n × n ) * ( f × f ) = ( n × n ),一般會填充0,如圖所示:
其中 n=4、f=3、p(padding amount)=1。
因此,后面說的卷積有兩種模式:
- Valid convolution:不填充數據
- Same convolution:填充數據,輸入輸出大小相同,p=(f-1)/2
沒有特殊說明一般指Valid convolution。
此外,還有一個參數是卷積的歩長s (strided convolution),一般默認s=1,下面給出了一個s=2的例子:
所以,卷積后的大小為:
1.4 三維卷積:
下面給出了一個三通道圖像卷積的示例:
圖像的大小為 6×6×3,分別為寬w、高h、通道數c。濾波器也是三維的,其中濾波器的通道數必須與圖像相同,所以后面可能不會注明濾波器的通道數。最終的結果是只有一個通道的4×4圖像。
如果我們有多個濾波器 (Multiple filters),可以做以下運算:
當有兩個濾波器的時候,可以得到一個二通道圖像。
2. 卷積層 (Convolution layer)
其實,使用多個濾波器對圖像進行處理就構成了一個卷積層,同該例:
下面對卷積層進行符號說明:如果第ζ層是一個卷積層:
Example ConvNet:
其中前三層都為卷積層,最后一層使用了全連接和softmax激活函數。
3. 池化層 (Pooling layer)
池化其實是一種降采樣,有多種不同形式的非線性池化函數。最常見的有“最大池化(Max pooling)”:
池化層沒有需要訓練的權重和閾值等參數,只有需要提前設定的超參數:f (filter size)、s (stride)、max or average pooling。
4. 卷積神經網絡
Neural network example:卷積層(CONV)、池化層(POOL)、全連接層(FC)
這是一種卷積神經網絡的經典模式:conv - pool - conv - pool - fc - fc -fc - softmax。因為池化層沒有參數,所以有時卷積層和池化層算作神經網絡的一層。其中的超參數盡量不要自己隨意設置,而應該參考別人文獻中的設置。
可以發現一個規律,隨着神經網絡的加深,激活值的size逐漸變小。
為什么要使用卷積?相比於全連接層有什么優勢?
- 參數共享,適用於圖像一部分的特征檢測器(例如邊緣檢測)也同樣適用於圖像的其他部分,可以看出卷積層參數遠遠小於全連接層;
- 稀疏連接,卷積層輸出的每個數值僅依賴於輸入的很小一部分,不受其他部分的影響。
5. 經典的卷積神經網絡
5.1 LeNet-5
結構:conv - pool - conv - pool - fc - fc - softmax
該網絡提出的時間較早,使用的激活函數還是 sigmoid / tanh
5.2 AlexNet
該網絡比 LeNet 更大,但更簡單。使用的激活函數是 ReLU
5.3 VGG-16
這種網絡很大,但結構規整且不復雜。
5.4 ResNet (殘差網絡)
Residual block (殘差塊):
添加這樣一個“捷徑”,就可以構成一個殘差塊,將信息傳遞到網絡的更深層。
神經網絡會隨着層數的增加,訓練誤差減小,但數值傳遞的越深,任何一個細小的誤差都會放大,訓練誤差反而增加。ResNet有助於解決梯度消失和爆炸問題,可以訓練更深層的網絡並保證良好的性能。
5.5 谷歌 Inception 網絡
先介紹一下1×1卷積:
經過1×1的濾波器卷積后的圖像寬和高不變,每個像素值僅與原圖該像素的通道值有關。如果使用n個1×1的濾波器,那么就可以獲得寬和高不變,通道數變為n的圖像了。
上圖中,兩種卷積效果基本相同,但下面的計算量僅為原來的十分之一。
Inception網絡將幾種卷積和池化方式放入一層計算,讓網絡自己選擇用哪種方法:
Inception network:
6. 遷移學習和數據擴充
6.1 遷移學習
如果當前任務可用數據較少,可以嘗試使用別人已經訓練好的網絡,兩個任務之間最好具有一定的相似性(例如我想訓練一個識別貓的網絡,可以用別人識別狗的網絡)。然后刪除該網絡已有的softmax層,創建自己需要的softmax層。將修改后的網絡前面幾層參數全部凍結,只訓練最后的softmax層。這樣自己的訓練集即使很小,也能獲得不錯的結果。
自己的訓練集越大,需要凍結的層數就越少,可以訓練的層數越多。
6.2 數據擴充
在計算機視覺領域,擴充數據對大多數任務都有幫助。常見的修改圖片的方法有:鏡像對稱、隨意裁剪、旋轉、扭曲變換、色彩轉換...
7. 目標檢測
7.1 一些符號定義
假設我們檢測的對象有:1 - pedestrian,2 - car,3 - motorcycle,4 - background(沒有對象,只有背景)。
將上圖輸入到神經網絡,那么應該輸出是否檢測到對象(pc=1,存在對象;pc=0,只有背景,此時后面七個參數沒有意義)、檢測到的對象位置及其邊框信息(bx、by、bh、bw)、檢測到哪個對象(c1、c2、c3,只有一個為1,其他為0)。上圖的輸出大概為:y = [1,0.5,0.7,0.3,0.4,0,1,0]。
損失函數 (cost function):
7.2 特征點檢測
這種方法需要先選定特征點個數,並生成包含這些特征點的標簽訓練集,然后利用神經網絡輸出關鍵特征點的位置。
例如下圖中的人臉,如果有128個特征點,輸出應該有129個參數(一個判斷是否存在 face,其他是128個特征點位置)。
7.3 基於滑動窗口的目標檢測 (Sliding windows detection)
該方法先選擇一個小窗口,固定歩長滑動窗口,遍歷圖像,輸入到卷積神經網絡中判斷,在增大窗口,重復以上操作...
但以上步驟的計算成本高,可以發現有很多冗余計算。
為了改善這個問題,這里先介紹如何將全連接層轉換為卷積層:
這兩個網絡是相同的,但下面的網絡只有卷積運算了。
Convolution implementation of sliding windows:
假設我們的圖片大小為16×16,窗口大小為14×14,滑動窗口后,需要向卷積神經網絡輸入四次並計算,如我們將整張圖片直接輸入,如上圖,那么我們就不需要再重復計算了,沒有再進行中間重疊部分的冗余計算了。
7.4 YOLO算法
這里使用了3×3的網格,實際使用中會使用更精細的網格 (如19×19),YOLO算法基本思路是將之前介紹的圖像定位和分類算法應用到每個格子中,每個格子都會輸出一個y(7.1所描述的y,但在這里,對象的位置是相對於所在的格子,而不是整張圖片,bh和bw可能會大於1。每個對象根據中點的位置只會被分配到一個格子中,即使對象橫跨幾個格子。) ,所以這里的目標輸出尺寸是3×3×8。
這樣做的好處就是神經網絡可以輸出精確的邊界框。因為只有一次卷積網絡計算,所以YOLO的運行速度非常快,可以達到實時識別。
更多細節可以看原文文獻,據說難度相對較高。
7.5 交並比 (Intersection over union)
交並比是為了判斷目標檢測算法運作是否良好,通過計算兩個邊框的交集和並集的比,一般大於0.5就認為是可接受的。
7.6 非極大值抑制 (Non-max suppression)
非極大值抑制是為了確保每個對象只被檢測到一次。
在滑動窗口中,如果已經檢測到多個邊界框了:1)先拋棄概率 (Pc) 較低的輸出邊界框;2)在剩余的邊界框中選擇概率最高的邊框,預輸出;3)去掉剩下與該邊框有高度重疊的邊框;4)重復2~3步,直到處理完畢。
在YOLO中,也是類似的,先找到概率最大的格子,認為是最可靠的檢測,標記,再逐一審視剩下的矩形,和這個邊框有高交並比或高度重疊的其他邊框會被抑制輸出。
如果有多種對象,需要獨立進行多次非極大值抑制。
7.7 Anchor boxes
如果一個格子或窗口中可能存在多個對象,那么久需要增加輸出y的維度了:
這樣的輸出就可以檢測出兩個以內的對象了。
7.8 R-CNN
帶區域的卷積網絡 (R-CNN) 主要是嘗試選出一些候選區域 ( Region proposals),在這些區域上運行卷積網絡分類器,這樣就可以只在少數窗口上運行了。例如下面的圖像使用圖像分割算法得到色塊,在色塊上運行卷積網絡。
R-CNN運行很慢,也有很多改進算法,例如Fast R-CNN、Faster R-CNN等。
8. 人臉識別 (Face recognition)
Verification (驗證):
- 輸入:圖像、名字或ID
- 輸出:輸入的圖像是否是該名字或ID對應的人
Recognition (識別):
- 已有一個K個人的數據庫
- 輸入:圖像
- 輸出:圖像中的人所對應的ID,或無法識別
Siamese network:對於兩個不同的輸入,運行相同的卷積神經網絡,然后比較它們。損失函數:
Triple loss:訓練對象是一個三元組 (anchor、positive、negative):
9. 風格遷移 (Neural style transfer)
10. 關於深層卷積神經網絡到底在學什么
卷積神經網絡的可視化:
層數越深,特征越復雜。
以上內容主要參考吳恩達《深度學習》課程第四課
tensorflow2.0 搭建卷積神經網絡可見:tf.keras搭建CNN