1. 程式人生 > >機器學習入坑指南(十一):卷積神經網路

機器學習入坑指南(十一):卷積神經網路

上一篇文章中,我們準備好了深度學習所需的資料。為了實現分辨貓狗的目的,我們決定使用卷積神經網路(Convolutional Neural Networks,CNN),目前它在影象識別方面十分受歡迎,那麼到底什麼是卷積神經網路呢?我們應該怎麼去理解它?

1 CNN 基本結構

一個基本的 CNN 結構為:輸入層 -> 卷積層 -> 池化層 -> 卷積層 -> 池化層 -> 全連線層 -> 輸出層

2 卷積

什麼是卷積

話不多說,先上張圖。

左圖中 333*3 的黃色區域即 “卷積核”(Kernel),或者稱之為卷積模板。其中右下角的數字可以理解為權值,卷積核每移動一步,就會計算權值和當前重疊區域的對應畫素值的乘積之和,來作為下一層中的新值。由於卷積被認為是提取區域性特徵的過程,所以卷積後的輸出又叫特徵圖。

“卷積”,是對英文的直譯,對於上面這種操作,我覺得叫 “加權疊加” 更好理解一點,不過叫卷有叫卷的道理,不必糾結這些。

想要深入理解的話需要從數學和物理(訊號學)兩個方面著手,對於以深度學習應用為目的的我們,目前瞭解到這個程度就可以了。

為什麼要卷積?

在講這個問題之前,我們需要認識到機器學習更偏向於“工程”,有時候我們並不需要太嚴密的論證,就可以使用一些“感覺上”有效的工具。卷積和池化均屬於這種工具,雖然目前還沒有徹底搞清楚為什麼使用這兩種工具會得到不錯的結果,但事實是確實這樣做結果不錯。

提取影象特徵

上面已經說過了,卷積可以提取影象的區域性特徵。通常人眼識別影象也不是以孤立的畫素為單位的,所以卷積被認為是合理的。然鵝,通過卷積提取出的特徵好像跟我們理解的特徵不太一樣,或者人根本不認為那是特徵,但事實證明,讓機器自己去做往往比我們使用特徵工程的結果要好。這正是卷積神經網路能夠逆襲 SVM 的重要原因之一。

降低計算量

相較全連線層,卷積層只需要跟與卷積核相同大小的輸入層神經元連線。

比如我們有一個 100100100*100 的影象,中間一個隱含層有 100100 個神經元,如果為全連線層,則需要計算 (100100+1)100(100*100+1)*100 個權值,共 1000100 個(+1 為 bias),而如果使用大小為 555*5 ,步長為 1 的卷積層,則需要計算的權值個數為:

55[(1005+1)(1005+1)+1]=2304255*5*[(100-5+1)*(100-5+1)+1]=230425

計算量已經大大減少了。而如果我們只使用一種卷積核,那麼實際上卷積層每個神經元連線的 5

55*5 的區域的權值都是相同的,也就是我們最終只需要得到 55+1=265*5+1=26 個權值即可。

P.S. 由於影象的特徵有很多種類,使用一種卷積核只能提取一部分的特徵,所以我們通常使用多個卷積核,也就是會得到多種特徵圖。注意這些卷積核正是神經網路學習得到的成果,我們只是簡單地設定了卷積核的個數。

3 池化

什麼是池化

看圖。

池化是一種下采樣,也就是在原圖上開窗,並把整個視窗作為一個新的畫素,可以採用原圖視窗中的最大值作為新畫素的值(稱為最大池化策略),或是其它的取樣方法(如均值池化策略)。

為什麼要池化?

降低計算量與防止過擬合

經過池化層後下一層需要計算的引數明顯變少了。但其實多加了這麼一層,總的計算量不一定就減小了,這只是相較全連線層而言。更重要的作用是卷積層輸出的特徵經過池化之後維度降低了,可以防止過擬合(即防止少量畫素就會影響識別結果)。

使模型對小的變化不敏感

由於池化可以看作是提取區域的特徵,這個區域發生一些微小的平移和變形並不會太影響池化的結果,所以有人認為交叉使用池化層可以降低模型對這些微小變化的敏感性。當然這只是一種“看上去合理”的說法。

4 全連線層

在經過重複的卷積、池化過程後,我們又加入了一個全連線層。至於為什麼要加,仍然是解釋不清楚的,大概是和一般的神經網路類比,像是一種經驗上的遷移。當然也有很多正兒八經的解釋,可以在知乎上搜一搜。

關於卷積神經網路,要說的就是這麼多,深度學習是一個不斷髮展的知識體系,我們要做的就是在合理推測與大膽嘗試中不斷向前。