本文基於您已經瞭解卷積神經網絡的基本知識,在此之上介紹LeNet5的原理,以及利用它實現MNIST手寫數字識別。git
LeNet是一種典型的卷積神經網絡的結構,由Yann LeCun發明。它的網路結構以下圖:github
LeNet-5共有7層(不包含輸入),每層都包含可訓練參數。輸入圖像大小爲32x32,比MNIST數據集的圖片要大一些,這麼作的緣由是但願潛在的明顯特徵如筆畫斷點或角可以出如今最高層特徵檢測子感覺野(receptive field)的中心。所以在訓練整個網絡以前,須要對28x28的圖像加上paddings(即周圍填充0)。api
C1層:該層是一個卷積層。使用6個大小爲5x5的卷積覈對輸入層進行卷積運算,特徵圖尺寸爲32-5+1=28,所以產生6個大小爲28x28的特徵圖。這麼作夠防止原圖像輸入的信息掉到卷積核邊界以外。網絡
S2層:該層是一個池化層(pooling,也稱爲下采樣層)。這裏採用max_pool(最大池化),池化的size定爲2x2,池化的具體過程以下圖(圖引自cs231n)ide
C3層:該層仍爲一個卷積層,咱們選用大小爲5x5的16種不一樣的卷積核。這裏須要注意:C3中的每一個特徵圖,都是S2中的全部6個或其中幾個特徵圖進行加權組合獲得的。輸出爲16個10x10的特徵圖。函數
S4層:該層仍爲一個池化層,size爲2x2,仍採用max_pool。最後輸出16個5x5的特徵圖,神經元個數也減小至16x5x5=400。測試
C5層:該層咱們繼續用5x5的卷積覈對S4層的輸出進行卷積,卷積核數量增長至120。這樣C5層的輸出圖片大小爲5-5+1=1。最終輸出120個1x1的特徵圖。這裏其實是與S4全鏈接了,但仍將其標爲卷積層,緣由是若是LeNet-5的輸入圖片尺寸變大,其餘保持不變,那該層特徵圖的維數也會大於1x1。編碼
F6層:該層與C5層全鏈接,輸出84張特徵圖。爲何是84?下面有論文的解釋(感謝翻譯)。idea
輸出層:該層與F6層全鏈接,輸出長度爲10的張量,表明所抽取的特徵屬於哪一個類別。(例如[0,0,0,1,0,0,0,0,0,0]的張量,1在index=3的位置,故該張量表明的圖片屬於第三類).net
此處爲論文對F6層和輸出層的解釋:
輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每一個有84個輸入。換句話說,每一個輸出RBF單元計算輸入向量和參數向量之間的歐式距離。輸入離參數向量越遠,RBF輸出的越大。一個RBF輸出能夠被理解爲衡量輸入模式和與RBF相關聯類的一個模型的匹配程度的懲罰項。用機率術語來講,RBF輸出能夠被理解爲F6層配置空間的高斯分佈的負log-likelihood。給定一個輸入模式,損失函數應能使得F6的配置與RBF參數向量(即模式的指望分類)足夠接近。這些單元的參數是人工選取並保持固定的(至少初始時候如此)。這些參數向量的成分被設爲-1或1。雖然這些參數能夠以-1和1等機率的方式任選,或者構成一個糾錯碼,可是被設計成一個相應字符類的7*12大小(即84)的格式化圖片。這種表示對識別單獨的數字不是頗有用,可是對識別可打印ASCII集中的字符串頗有用。
使用這種分佈編碼而非更經常使用的「1 of N」編碼用於產生輸出的另外一個緣由是,當類別比較大的時候,非分佈編碼的效果比較差。緣由是大多數時間非分佈編碼的輸出必須爲0。這使得用sigmoid單元很難實現。另外一個緣由是分類器不只用於識別字母,也用於拒絕非字母。使用分佈編碼的RBF更適合該目標。由於與sigmoid不一樣,他們在輸入空間的較好限制的區域內興奮,而非典型模式更容易落到外邊。RBF參數向量起着F6層目標向量的角色。須要指出這些向量的成分是+1或-1,這正好在F6 sigmoid的範圍內,所以能夠防止sigmoid函數飽和。實際上,+1和-1是sigmoid函數的最大彎曲的點處。這使得F6單元運行在最大非線性範圍內。必須避免sigmoid函數的飽和,由於這將會致使損失函數較慢的收斂和病態問題。
基於LeNet-5的原理,我使用了TensorFlow來作了簡單實現。
Features:
Gradient-Based Learning Applied to Document Recognition
CNN - TensorFlow
通俗理解卷積神經網絡