手寫數字識別算法的設計與實現
本文使用python基于TensorFlow設計手寫數字識別算法,并編程實現GUI界面,構建手寫數字識別系統。這是本人的本科畢業論文課題,當然,這個也是機器學習的基本問題。本博文不會以論文的形式展現,而是以編程實戰完成機器學習項目的角度去描述。
項目要求:本文主要解決的問題是手寫數字識別,最終要完成一個識別系統。
設計識別率高的算法,實現快速識別的系統。
1 LeNet-5模型的介紹
本文實現手寫數字識別,使用的是卷積神經網絡,建模思想來自LeNet-5,如下圖所示:
這是原始的應用于手寫數字識別的網絡,我認為這也是最簡單的深度網絡。
LeNet-5不包括輸入,一共7層,較低層由卷積層和最大池化層交替構成,更高層則是全連接和高斯連接。
LeNet-5的輸入與BP神經網路的不一樣。這里假設圖像是黑白的,那么LeNet-5的輸入是一個32*32的二維矩陣。同時,輸入與下一層并不是全連接的,而是進行稀疏連接。本層每個神經元的輸入來自于前一層神經元的局部區域(5×5),卷積核對原始圖像卷積的結果加上相應的閾值,得出的結果再經過激活函數處理,輸出即形成卷積層(C層)。卷積層中的每個特征映射都各自共享權重和閾值,這樣能大大減少訓練開銷。降采樣層(S層)為減少數據量同時保存有用信息,進行亞抽樣。
第一個卷積層(C1層)由6個特征映射構成,每個特征映射是一個28×28的神經元陣列,其中每個神經元負責從5×5的區域通過卷積濾波器提取局部特征。一般情況下,濾波器數量越多,就會得出越多的特征映射,反映越多的原始圖像的特征。本層訓練參數共6×(5×5+1)=156個,每個像素點都是由上層5×5=25個像素點和1個閾值連接計算所得,共28×28×156=122304個連接。
S2層是對應上述6個特征映射的降采樣層(pooling層)。pooling層的實現方法有兩種,分別是max-pooling和mean-pooling,LeNet-5采用的是mean-pooling,即取n×n區域內像素的均值。C1通過2×2的窗口區域像素求均值再加上本層的閾值,然后經過激活函數的處理,得到S2層。pooling的實現,在保存圖片信息的基礎上,減少了權重參數,降低了計算成本,還能控制過擬合。本層學習參數共有1*6+6=12個,S2中的每個像素都與C1層中的2×2個像素和1個閾值相連,共6×(2×2+1)×14×14=5880個連接。
S2層和C3層的連接比較復雜。C3卷積層是由16個大小為10×10的特征映射組成的,當中的每個特征映射與S2層的若干個特征映射的局部感受野(大小為5×5)相連。其中,前6個特征映射與S2層連續3個特征映射相連,后面接著的6個映射與S2層的連續的4個特征映射相連,然后的3個特征映射與S2層不連續的4個特征映射相連,最后一個映射與S2層的所有特征映射相連。此處卷積核大小為5×5,所以學習參數共有6×(3×5×5+1)+9×(4×5×5+1)+1×(6×5×5+1)=1516個參數。而圖像大小為28×28,因此共有151600個連接。
新聞熱點
疑難解答