CNN網絡--LeNet5


因為卷積神經網絡的經典模型是:Lenet-5實現,只要理解了這個的前向傳導過程,基本上就OK了,因此我們后面主要講解Lenet-5的實現。

  • 輸入尺寸:32*32
  • 卷積層:3個
  • 降采樣層:2個
  • 全連接層:1個
  • 輸出:10個類別(數字0-9的概率)

一、理論階段

作為CNN的入門文章,沒有打算啰嗦太多的東西,因為什么權值共享、局部感受野什么的,講那么多,都是那些生物學的相關理論,看了那些玩意,大部分初學者已經煩了。卷積神經網絡的相關博文也是一大堆,但是講的,基本上都是抄過來抄過去,就像我之前不理解從S2層到C3層是怎么實現的,網上看了一大堆教程,沒有一個解答這個問題的。我的個人感覺整個過程,就只有S2到C3是最難理解的。接着我將用最淺顯易懂的方式進行講解。

1、卷積

卷積的概念這個我想只要學過圖像處理的人都懂的概念了,這個不解釋。我們知道對於給定的一幅圖像來說,給定一個卷積核,卷積就是根據卷積窗口,進行像素的加權求和。

卷積神經網絡與我們之前所學到的圖像的卷積的區別,我的理解是:我們之前學圖像處理遇到卷積,一般來說,這個卷積核是已知的,比如各種邊緣檢測算子、高斯模糊等這些,都是已經知道卷積核,然后再與圖像進行卷積運算。然而深度學習中的卷積神經網絡卷積核是未知的,我們訓練一個神經網絡,就是要訓練得出這些卷積核,而這些卷積核就相當於我們學單層感知器的時候的那些參數W,因此你可以把這些待學習的卷積核看成是神經網絡的訓練參數W。

2、池化

剛開始學習CNN的時候,看到這個詞,好像高大上的樣子,於是查了很多資料,理論一大堆,但是實踐、算法實現卻都沒講到,也不懂池化要怎么實現?其實所謂的池化,就是圖片下采樣。這個時候,你會發現CNN每一層的構建跟圖像高斯金字塔的構建有點類似,因此你如果已經懂得了圖像金字塔融合的相關算法,那么就變的容易理解了。在高斯金子塔構建中,每一層通過卷積,然后卷積后進行下采樣,而CNN也是同樣的過程。廢話不多說,這里就講一下,CNN的池化:

CNN的池化(圖像下采樣)方法很多:Mean pooling(均值采樣)、Max pooling(最大值采樣)、Overlapping (重疊采樣)、L2 pooling(均方采樣)、Local Contrast Normalization(歸一化采樣)、Stochasticpooling(隨即采樣)、Def-pooling(形變約束采樣)。其中最經典的是最大池化,因此我就解釋一下最大池化的實現:

原圖片

為了簡單起見,我用上面的圖片作為例子,假設上面的圖片大小是4*4的,如上圖所示,然后圖片中每個像素點的值是上面各個格子中的數值。然后我要對這張4*4的圖片進行池化,池化的大小為(2,2),跨步為2,那么采用最大池化也就是對上面4*4的圖片進行分塊,每個塊的大小為2*2,然后統計每個塊的最大值,作為下采樣后圖片的像素值,具體計算如下圖所示:

也就是說我們最后得到下采樣后的圖片為:

這就是所謂的最大池化。當然以后你還會遇到各種池化方法,比如均值池化,也就是對每個塊求取平均值作為下采樣的新像素值。還有重疊采樣的池化,我上面這個例子是沒有重疊的采樣的,也就是每個塊之間沒有相互重疊的部分,上面我說的跨步為2,就是為了使得分塊都非重疊,等等,這些以后再跟大家解釋池化常用方法。這里就先記住最大池化就好了,因為這個目前是最常用的。

3、feature maps 

這個單詞國人把它翻譯成特征圖,挺起來很專業的名詞。那么什么叫特征圖呢?特征圖其實說白了就是CNN中的每張圖片,都可以稱之為特征圖張。在CNN中,我們要訓練的卷積核並不是僅僅只有一個,這些卷積核用於提取特征,卷積核個數越多,提取的特征越多,理論上來說精度也會更高,然而卷積核一堆,意味着我們要訓練的參數的個數越多。在LeNet-5經典結構中,第一層卷積核選擇了6個,而在AlexNet中,第一層卷積核就選擇了96個,具體多少個合適,還有待學習。

回到特征圖概念,CNN的每一個卷積層我們都要人為的選取合適的卷積核個數,及卷積核大小。每個卷積核與圖片進行卷積,就可以得到一張特征圖了,比如LeNet-5經典結構中,第一層卷積核選擇了6個,我們可以得到6個特征圖,這些特征圖也就是下一層網絡的輸入了。我們也可以把輸入圖片看成一張特征圖,作為第一層網絡的輸入。

4、CNN的經典結構

對於剛入門CNN的人來說,我們首先需要現在的一些經典結構:

(1)LeNet-5。這個是n多年前就有的一個CNN的經典結構,主要是用於手寫字體的識別,也是剛入門需要學習熟悉的一個網絡,我的這篇博文主要就是要講這個網絡

(2)AlexNet。

在imagenet上的圖像分類challenge上大神Alex提出的alexnet網絡結構模型贏得了2012屆的冠軍,振奮人心,利用CNN實現了圖片分類,別人用傳統的機器學習算法調參跳到半死也就那樣,Alex利用CNN精度遠超傳統的網絡。

其它的還有什么《Network In Network》,GoogLeNet、Deconvolution Network,在以后的學習中我們會遇到。比如利用Deconvolution Network反卷積網絡實現圖片的去模糊,牛逼哄哄。

    OK,理論階段就啰嗦到這里就好了,接着就講解 LeNet-5, LeNet-5是用於手寫字體的識別的一個經典CNN:

LeNet-5結構

輸入:32*32的手寫字體圖片,這些手寫字體包含0~9數字,也就是相當於10個類別的圖片

輸出:分類結果,0~9之間的一個數

因此我們可以知道,這是一個多分類問題,總共有十個類,因此神經網絡的最后輸出層必然是SoftMax問題,然后神經元的個數是10個。LeNet-5結構:

輸入層:32*32的圖片,也就是相當於1024個神經元

C1層:paper作者,選擇6個特征卷積核,然后卷積核大小選擇5*5,這樣我們可以得到6個特征圖,然后每個特征圖的大小為32-5+1=28,也就是神經元的個數為6*28*28=784。

S2層:這就是下采樣層,也就是使用最大池化進行下采樣,池化的size,選擇(2,2),也就是相當於對C1層28*28的圖片,進行分塊,每個塊的大小為2*2,這樣我們可以得到14*14個塊,然后我們統計每個塊中,最大的值作為下采樣的新像素,因此我們可以得到S1結果為:14*14大小的圖片,共有6個這樣的圖片。

C3層:卷積層,這一層我們選擇卷積核的大小依舊為5*5,據此我們可以得到新的圖片大小為14-5+1=10,然后我們希望可以得到16張特征圖。那么問題來了?這一層是最難理解的,我們知道S2包含:6張14*14大小的圖片,我們希望這一層得到的結果是:16張10*10的圖片。這16張圖片的每一張,是通過S2的6張圖片進行加權組合得到的,具體是怎么組合的呢?問題如下圖所示:

為了解釋這個問題,我們先從簡單的開始,我現在假設輸入6特征圖的大小是5*5的,分別用6個5*5的卷積核進行卷積,得到6個卷積結果圖片大小為1*1,如下圖所示:

    為了簡便起見,我這里先做一些標號的定義:我們假設輸入第i個特征圖的各個像素值為x1i,x2i……x25i,因為每個特征圖有25個像素。因此第I個特征圖經過5*5的圖片卷積后,得到的卷積結果圖片的像素值Pi可以表示成:

這個是卷積公式,不解釋。因此對於上面的P1~P6的計算方法,這個就是直接根據公式。然后我們把P1~P6相加起來,也就是:

P=P1+P2+……P6

把上面的Pi的計算公式,代入上式,那么我們可以得到:

P=WX

其中X就是輸入的那6張5*5特征圖片的各個像素點值,而W就是我們需要學習的參數,也就相當於6個5*5的卷積核,當然它包含着6*(5*5)個參數。因此我們的輸出特征圖就是:

Out=f(P+b)

這個就是從S2到C3的計算方法,其中b表示偏置項,f為激活函數。

我們回歸到原來的問題:有6張輸入14*14的特征圖片,我們希望用5*5的卷積核,然后最后我們希望得到一張10*10的輸出特征圖片?

根據上面的過程,也就是其實我們用5*5的卷積核去卷積每一張輸入的特征圖,當然每張特征圖的卷積核參數是不一樣的,也就是不共享,因此我們就相當於需要6*(5*5)個參數。對每一張輸入特征圖進行卷積后,我們得到6張10*10,新圖片,這個時候,我們把這6張圖片相加在一起,然后加一個偏置項b,然后用激活函數進行映射,就可以得到一張10*10的輸出特征圖了。

而我們希望得到16張10*10的輸出特征圖,因此我們就需要卷積參數個數為16*(6*(5*5))=16*6*(5*5)個參數。總之,C3層每個圖片是通過S2圖片進行卷積后,然后相加,並且加上偏置b,最后在進行激活函數映射得到的結果。

S4層:下采樣層,比較簡單,也是知己對C3的16張10*10的圖片進行最大池化,池化塊的大小為2*2。因此最后S4層為16張大小為5*5的圖片。至此我們的神經元個數已經減少為:16*5*5=400。

C5層:我們繼續用5*5的卷積核進行卷積,然后我們希望得到120個特征圖。這樣C5層圖片的大小為5-5+1=1,也就是相當於1個神經元,120個特征圖,因此最后只剩下120個神經元了。這個時候,神經元的個數已經夠少的了,后面我們就可以直接利用全連接神經網絡,進行這120個神經元的后續處理,后面具體要怎么搞,只要懂多層感知器的都懂了,不解釋。

上面的結構,只是一種參考,在現實使用中,每一層特征圖需要多少個,卷積核大小選擇,還有池化的時候采樣率要多少,等這些都是變化的,這就是所謂的CNN調參,我們需要學會靈活多變。

比如我們可以把上面的結構改為:C1層卷積核大小為7*7,然后把C3層卷積核大小改為3*3等,然后特征圖的個數也是自己選,說不定得到手寫字體識別的精度比上面那個還高,這也是有可能的,總之一句話:需要學會靈活多變,需要學會CNN的調參。

在S2--->C3之間的實現根據原作者:

局部感知(讓一個小塊對應一個神經元,計算出的一個像素就是一個神經元,一張圖片由無數個神經元鋪滿)

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

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

參數共享

盡管減少了幾個數量級,但參數數量依然較多。能不能再進一步減少呢?能!方法就是權值共享。具體做法是,在局部連接中隱藏層的每一個神經元連接的是一個 10×10 的局部圖像,因此有10×10 個權值參數,將這 10×10 個權值參數共享給剩下的神經元,也就是說隱藏層中 106個神經元的權值參數相同,那么此時不管隱藏層神經元的數目是多少,需要訓練的參數就是這 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,w2 兩個卷積核在ARGB四通道上進行卷積操作,在生成 w1 對應的 Feature Map 時,w1 這個卷積核對應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,卷積層用 Cx 表示,子采樣層(pooling)用Sx表示,全連接層用Fx表示,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 (S函數:0-1區間)值,作為對應的該單元的值。(這個地方和之前自己想的不太一樣)所以S2層中每 feature map 的長寬都是上一層C1的一半。S2層需要2×6=12個參數,連接數為(4+1)×14×14×6 = 5880。注:這里池化的過程與ufldl教程中略有不同。下面為卷積操作與池化的示意圖:

         C3層也是一個卷積層(多通道(14個通道)),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個數)參數(自己的理解:和C3的不同,這一層一共有120個16維的5*5大小的卷積核,且每一個核中的16維模板都一樣),連接數也是這么多。

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

 

Reference:

Convolutional Neural Networks (LeNet)

深度學習(四)卷積神經網絡入門學習(1)

卷積神經網絡(三):卷積神經網絡CNN的簡單實現(部分Python源碼)

卷積神經網絡(一):LeNet5的基本結構

CNN學習筆記——理解結構,LeNet5介紹

LetNet5卷積參數理解
 


免責聲明!

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



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