(六)6.17 Neurons Networks convolutional neural network(cnn)


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

 局部感知

局部感知野。一般認為人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。每個隱含單元僅僅連接輸入單元的一部分。例如,每個隱含單元僅僅連接輸入圖像的一小片相鄰區域。對於一個輸入與隱層均有 $10^6$ 的網絡,假設每個隱含單元只與 10*10 的輸入區域相連接,這時參數的個數變為 $10 \times 10 \times  $10^6= 10^8$,降低了$10^4$ 個數量級,這樣訓練起來就沒有那么費力了。這一思想主要受啟發於生物學里面的視覺系統結構。視覺皮層的神經元就是局部接受信息的(即這些神經元只響應某些特定區域的刺激),此外圖像的像素也是局部時空相關的。

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

 參數共享

盡管減少了幾個數量級,但參數數量依然較多。能不能再進一步減少呢?能!方法就是權值共享。具體做法是,在局部連接中隱藏層的每一個神經元連接的是一個 10×10 的局部圖像,因此有10×10 個權值參數,將這 10×10 個權值參數共享給剩下的神經元,也就是說隱藏層中 $10^6$ 個神經元的權值參數相同,那么此時不管隱藏層神經元的數目是多少,需要訓練的參數就是這 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 的操作即為多通道卷積,下圖為 $w_1,w_2$ 兩個卷積核在ARGB四通道上進行卷積操作,在生成 $w_1$ 對應的 Feature Map 時,$w_1$ 這個卷積核對應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,卷積層用 $C_x$ 表示,子采樣層(pooling)用$S_x$表示,全連接層用$F_x$表示,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM