1. 程式人生 > >CS229 6.17 Neurons Networks convolutional neural network(cnn)

CS229 6.17 Neurons Networks convolutional neural network(cnn)

之前所講的影象處理都是小 patchs ,比如28*28或者36*36之類,考慮如下情形,對於一副1000*1000的影象,即106,當隱層也有106節點時,那麼W(1)的數量將達到1012級別,為了減少引數規模,加快訓練速度,CNN應運而生。CNN就像辟邪劍譜一樣,正常人練得很挫,一旦自宮後,就變得很厲害。CNN有幾個重要的點:區域性感知、引數共享、池化

 區域性感知

區域性感知野。一般認為人對外界的認知是從區域性到全域性的,而影象的空間聯絡也是區域性的畫素聯絡較為緊密,而距離較遠的畫素相關性則較弱。因而,每個神經元其實沒有必要對全域性影象進行感知,只需要對區域性進行感知,然後在更高層將區域性的資訊綜合起來就得到了全域性的資訊。每個隱含單元僅僅連線輸入單元的一部分。例如,每個隱含單元僅僅連線輸入影象的一小片相鄰區域。對於一個輸入與隱層均有 

106">106106 的網路,假設每個隱含單元只與 10*10 的輸入區域相連線,這時引數的個數變為 10×10×10×10×10^6= 10^8,降低了10^4$ 個數量級,這樣訓練起來就沒有那麼費力了。這一思想主要受啟發於生物學裡面的視覺系統結構。視覺皮層的神經元就是區域性接受資訊的(即這些神經元只響應某些特定區域的刺激),此外影象的畫素也是區域性時空相關的。

如下圖所示,左邊就是全連線網路,每個隱藏神經元與每個畫素進行連線。右邊就是部分連線網路,每個隱神經元只與一部分割槽域相連線。右邊的圖進行的便是卷積操作,該操作會生成一副 feature map 。

 引數共享

儘管減少了幾個數量級,但引數數量依然較多。能不能再進一步減少呢?能!方法就是權值共享。具體做法是,在區域性連線中隱藏層的每一個神經元連線的是一個 10×10 的區域性影象,因此有10×10 個權值引數,將這 10×10 個權值引數共享給剩下的神經元,也就是說隱藏層中 106106 個神經元的權值引數相同,那麼此時不管隱藏層神經元的數目是多少,需要訓練的引數就是這 10×10 個權值引數(也就是卷積核(也稱濾波器)的大小),如下圖。這樣來引數真的是極大的簡化了啊!這個思想主要來源於:自然影象有其固有特性,也就是說,影象的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特徵也能用在另一部分上,所以對於這個影象上的所有位置,我們都能使用同樣的學習特徵。

單核單通道卷積

如果隱神經元與其連線的100個輸入單元具有相同的100個引數,那麼就相當於是一個 10*10 的模板在原始的輸入影象上做卷積(當然需要加上一個偏置引數b),這樣相當於得到一個新的影象,新影象的大小為(1000-100+1)*(1000-100+1),因此也得名卷積神經網路。這樣的10*10的模板,我們也把它稱為一個卷積核。以下為單個卷積核示意圖:

多核單通道卷積

CNN中只用一個卷積核提取得到的特徵往往是不充分的,只能算作是一種型別的特徵(比如某個方向的邊緣),如果我們要提取其它方向的邊緣,那就多弄幾個卷積核,這樣就變成了多卷積核了。假設有k個卷積核,那麼可訓練的引數的個數就變為了k×10×10。注意沒有包含偏置引數。每個卷積核得到一副特徵影象也被稱為一個Feature Map。卷積的過程也被稱為特徵提取的過程,多核卷積中,隱層的節點數量為: k×(1000-100+1)×(1000-100+1) ,對於下圖的手寫數字灰度圖,做單通道卷及操作:

多核多通道卷積

當影象為RGB或ARGB(A代表透明度)時,可以在多通道進行卷積操作,或者對於堆疊卷積層來說, pooling 層之後可以繼續接下一個 卷積層,對 pooling 層多個 Feature Map 的操作即為多通道卷積,下圖為 w1,w2w1,w2 兩個卷積核在ARGB四通道上進行卷積操作,在生成 w1w1 對應的 Feature Map 時,w1w1 這個卷積核對應4個卷積模板,分別用4種不同的顏色表示,Feature Map 對應的位置的值是由四核卷積模板分別作用在4個通道的對應位置處的卷積結果相加然後取啟用函式得到的,所以在四通道得到2通道的過程中,引數數目為 4×2×2×2個,其中4表示4個通道,第一個2表示生成2個通道,最後的2×2表示卷積核大小。見下圖:

池化 pooling

通過卷積操作獲得了特徵 (features) 之後,下一步我們要利用這些特徵去做分類。可以用所有提取得到的特徵去訓練分類器,例如用這些特徵訓練一個 softmax 分類器,對於一個 96X96 畫素的影象,假設我們已經學習得到了400個 Feature Map,每個 Feature Map 都定義在 8X8 卷積核上,每一個卷積核和影象卷積都會得到一個 (96 − 8 + 1) * (96 − 8 + 1) = 7921 維的卷積特徵,由於有 400 個Feature Map,所以每個訓練樣例(輸入影象) 都會得到一個 7921* 400 = 3,168,400 維的卷積特徵向量。學習一個擁有超過 3 百萬特徵輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。

為了解決這個問題,首先回憶一下,之所以決定使用卷積後的特徵是因為影象具有一種“靜態性”的屬性,這也就意味著在一個影象區域有用的特徵極有可能在另一個區域同樣適用。因此,處理大影象時,一個很自然的想法就是對不同位置的特徵進行聚合統計,比如可以計算影象一個區域上的某個特定特徵的平均值 (或最大值)。這些概要統計特徵不僅具有低得多的維度 (相比使用所有提取得到的特徵),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。池化的過程通常也被稱為特徵對映的過程,如下圖過程如下所示:

CNN的應用

下面來看 LeNet-5 ,用於實現手寫識別的7層CNN(不包含輸入層),以下為LeNet-5的示意圖:

輸入原始影象的大小是32×32,卷積層用 CxCx 表示,子取樣層(pooling)用SxSx表示,全連線層用FxFx表示,x 代表層數。

         C1層是卷積層,單通道下用了6個卷積核,這樣就得到了6個feature map,其中每個卷積核的大小為5*5,用每個卷積核與原始的輸入影象進行卷積,這樣feature map的大小為(32-5+1)×(32-5+1)= 28×28,所需要的引數的個數為(5×5+1)×6= 156(其中5×5為卷積模板引數,1為偏置引數),連線數為(5×5+1)×28×28×6=122304(其中28×28為卷積後圖像的大小)。

         S2層為 pooling 層,也可以說是池化或者特徵對映的過程,擁有6個 feature map,每個feature map的大小為14*14,每個feature map的隱單元與上一層C1相對應的feature map的 2×2 單元相連線,這裡沒有重疊。計算過程是:2×2 單元裡的值相加然後再乘以訓練引數w,再加上一個偏置引數b(每一個feature map共享相同w和b),然後取sigmoid 值,作為對應的該單元的值。所以S2層中每 feature map 的長寬都是上一層C1的一半。S2層需要2×6=12個引數,連線數為(4+1)×14×14×6 = 5880。注:這裡池化的過程與ufldl教程中略有不同。下面為卷積操作與池化的示意圖:

         C3層也是一個卷積層(多通道16核卷積,注意此處C3並不是與S2全連線而是部分連線,見下圖),有16個卷積核,卷積模板的大小為5*5,因此具有16個feature maps,每個feature map的大小為(14-5+1×(14-5+1)= 10×10。每個feature map只與上一層S2中部分feature maps相連線,下表給出了16個feature maps與上一層S2的連線方式(行為S2層feature map的標號,列為C3層feature map的標號,第一列表示C3層的第0個feature map只有S2層的第0、1和2這三個feature maps相連線,其它解釋類似)。為什麼要採用部分連線,而不採用全連線呢?首先就是部分連線,可計算的引數就會比較少,其次更重要的是它能打破對稱性,這樣就能得到輸入的不同特徵集合。以第0個feature map描述計算過程:用1個卷積核(對應3個卷積模板,但仍稱為一個卷積核,可以認為是三維卷積核)分別與S2層的3個feature maps進行卷積,然後將卷積的結果相加,再加上一個偏置,再取sigmoid就可以得出對應的feature map了。所需要的引數數目為(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516(5×5為卷積引數,卷積核分別有 3 4 6 個卷積模板),連線數為1516*10*10= 151600 (98論文年論文給出的結果是156000,個人認為這是錯誤的,因為一個卷積核只有一個偏置引數 ?)。

         S4層也是取樣層,有16個feature maps,每個feature map的大小為5×5,計算過程和S2類似,需要引數個數為16×2 = 32個,連線數為(4+1)×5×5×16 = 2000.

         C5為卷積層,有120個卷積核,卷積核的大小仍然為5×5,因此有120個feature maps,每個feature map的大小都與上一層S4的所有feature maps進行連線,這樣一個卷積核就有16個卷積模板。Feature map的大小為1×1,這樣剛好變成了全連線,但是我們不把它寫成F5,因為這只是巧合。C5層有120*(5*5*16+1) = 48120(16為上一層所有的feature maps個數)引數,連線數也是這麼多。

         F6層有86個神經單元,每個神經單元與C5進行全連線。它的連線數和引數均為 86 × 120 = 10164 。這樣F6層就可以得到一個86維特徵了。後面可以使用該86維特徵進行做分類預測等內容了。注意:這裡卷積和池化的計算過程和ufldl教程中的計算略有不同。

 

參考:

1:UFLDL:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

2:論文:Gradient-BasedLearning Applied to Document Recognition

3:http://blog.csdn.net/stdcoutzyx/article/details/41596663

4:http://blog.csdn.net/lu597203933/article/details/46575779