高宇鵬 胡眾義



關鍵詞:Keras;卷積神經網絡;MNIST數據集
隨著社會發展,試卷分數、快遞單據、財務票據陽銀行票據等多個領域的手寫數字信息越來越多,勾了減輕數據的人工計算與手動錄入系統的工作量,手寫數字識別技術逐步發展起來。陳龍等采用3P神經網絡對MNIST數據集中的10000個樣本進行仿真實驗,取得97.2%識別率。宋曉茹等引人Sigmoid激活函數,采用深度神經網絡,將識別率提高到97.9%。Qiao,Junfei等采用自適應深度Q學習策略將識別率提高到了99.18%。但是Sigmoid激活函數計算量較大,反向傳播時容易出現梯度消失的情況,因此張哲等采用Relu激活函數代替Sigmoid,基于Tenso rflow框架,利用Softmax函數進行歸一化處理,對MNIST數據集進行訓練,將識別率提高為99.2%。Tensorflow框架對MNIST數據集進行訓練,能取得較高的識別率,但是需要編寫的代碼較多,訓練模型耗時較長,針對這種問題,楊永翌提出采用Keras模型構建卷積神經網絡,采用Tanh激活函數,對MNIST數據集進行訓練,取得98. 38%識別率。楊永翌采用Keras模型減少了代碼,但是降低了識別率,郭夢潔同樣采用Keras模型,利用Relu激活函數代替Tanh,結合Adam優化器,對MNIST數據集進行訓練,識別率達到99. 25%。王梅等采用改進VGG-16和樸素貝葉斯方法對MNIST數據集進行訓練,識別率達到99. 36%。余圣新等采用改進Inception卷積神經網絡結構對MNIST數據集進行訓練,識別率達到99. 45%。在Keras模型的基礎上,對模型進行改進,對MNIST數據集進行識別,識別率達到99. 54%,取得較好效果。
1Keras模型
Keras是由Python語言編寫的開源神經網絡學習庫。與Tensorflow相比,Keras提供了強大的神經網絡API庫,采用模塊化的編程,縮減代碼編寫量,是深度學習中使用較多的模型之一。Keras主要有Sequential和Model兩種模型。Sequential模型是Model模型的特例,它通過add()方法將多個網絡層線性的堆疊,因此它又被稱為序列模型。Sequential模型的第一層需要輸入shape數據參數,其余層可根據第一層的shape數據依次推導,不需要接收數據。這種模式輸入和輸出都是單一的,層層之間關聯簡單,沒有跨層關聯,因此編譯速度快,在簡單的模型設計中使用較多。Model模型是針對復雜的神經網絡而設計的一種模型,它采用多輸入和多輸出,通過model. layers添加各層信息,提供了共享層模型,實現訓練模型代碼的重用,在構建復雜神經網絡中被經常使用。
2激活函數
激活函數將非線性模型引入神經網絡中,強化了神經網絡的模擬和學習能力,在訓練復雜類型數據時,激活函數起著非常重要的作用。常用激活函數有Sigmoid、Tanh和Relu函數。
2.1Sigmoid激活函數
文獻[2]在手寫數字識別過程中,采用的激活函數為Sigmoid函數。Sigmoid函數的公式為:
2.2Tanh激活函數
文獻[6]基于Keras模型,采用Tanh作為激活函數。Tanh函數被稱為雙切正切函數,其公式為:
圖2為Tanh函數的曲線圖,可以看出Tanh函數與Sigmoid相比較,Sigmoid函數的輸出值都大于0,減慢了模型的收斂速度。Tanh函數的輸出值為[-1,1],與Sigmoid函數相比較,Tanh函數提高了模型的收斂速度。
從推導而得的公式3可知,Tanh函數相當于Sigmoid函數的變形,從本質上并沒有解決梯度消失的問題,因此Tanh函數也不適合深層次神經網絡模型的構建。
2.3Relu激活函數
Relu激活函數是目前應用比較多的一個函數,它的公式為:
從圖(3)、公式(4)和公式(5)可知,Relu激活函數其實就是一個求最大值的分段函數。當x的取值小于或等于O時,Relu函數不被激活,輸出為0;當x的取值大于O時,Relu函數被激活,取值為x。Relu函數沒有飽和區域,所以不存在梯度消失的情況,由于輸入值x為負時,Relu函數不被激活,意味著同一時刻只有部分神經元被激活,使得網絡變得比較稀疏,與Sigmoid和Tanh函數相比,Relu函數提高了訓練模型的效率和收斂的速度。因此改進的算法中采用的激活函數為Relu函數。
3基于Keras構建CNN手寫數字識別模型的改進
3.1卷積神經網絡結構的改進
卷積神經網絡的英文全稱為ConvolutionalNeural Network(CNN),是由加拿大神經科學家Hubel和Wiesel在研究貓腦皮層的神經元時提出。其主要思想是局部卷積、權值共享、空間或時間上的采樣,其中卷積操作是卷積神經網絡的核心。卷積操作就是利用卷積核對特征圖像的像素點按照從左到右的滑動方向進行局部卷積運算,從而提取每一層圖像的局部特征(Feature Map)。卷積運算的公式如下所示:
一般卷積神經網絡的結構主要由卷積層、池化層和全連接層的重復組合。文獻[6]在卷積神經網絡結構設計中,由兩個卷積層、一個池化層和兩個全連接層組成,圖4描述了文獻[6]采用的傳統的卷積網絡。首先對28*28的灰度圖像進行3*3的兩次卷積操作,得到64個24*24的圖像;然后通過2*2的池化層操作,變為64個12*12的圖像;最后加入2個全連接層(1個為激活函數為Relu,1個回歸函數為Softmax),輸出訓練的結果。
但是在實際的卷積操作過程中,每經過1次卷積操作就會增加1次訓練參數。傳統的卷積網絡結構在第1次卷積操作后,參數個數為320;第2次卷積操作后,參數個數達到了18496;經過2次全連接后,最終參數個數為1199882。過多的參數增加了訓練時間,同時會造成過擬合情況。基于此,在傳統的卷積網絡結構的基礎上進行了結構的改進,采用兩個卷積層、兩個池化層和兩個全連接層構成。首先對28*28的灰度圖像進行5*5卷積核操作,采用2*2模型進行池化操作;其次進行3*3卷積核操作,采用2*2模型進行池化操作,為了防止參數過多造成的過擬合,加入了Dropout層,丟棄50%的神經元,簡化了參數;最后進行3次全連接(2次激活函數為Relu,1次回歸函數為Softmax),輸出訓練的結果。改進后的卷積網絡結構如圖5所示。
3.2實驗結果分析
改進模型采用的實驗環境為:Windowsl0的操作系統,InteI(R)
Core (TM)i7-4700的CPU,16GP的內存容量,NVIDIA GeForce RTX 2070的GPU;Anaconda3下的Jupyter工具;基于python語言的Keras框架。實驗中采用的數據集為目前常用的MNIST數據集,對文獻[6]中傳統的卷積網絡結構和采用的改進卷積網絡結構進行了測試對比分析。
表1為采用傳統的卷積網絡結構實驗數據。首先進行了2次卷積操作,得到18496個訓練參數;然后經過1次池化層操作,加入Dropout防止過擬合,丟棄25%的神經元,并加入Flatten展平層,將訓練的數據展平為適合的網絡結構;再次進行了1次激活函數為Relu的全連接層和1次回歸函數為Softmax的全連接層,中間又加入了Dropout防止過擬合,丟棄25%的神經元,實驗最后總的訓練參數為1199882。
表2為采用改進卷積網絡結構的實驗數據。首先進行了1次卷積操作,得到832個訓練參數,經過1次池化層操作;其次再進行了1次卷積操作,得到4624個訓練參數;經過1次池化層操作;然后加入Dropout防止過擬合,丟棄50%的神經元,并加入Flatten層,將訓練的數據展平為適合的網絡結構;再次進行了2次激活函數為Relu的全連接層和1次回歸函數為Softmax的全連接層,實驗最后總的訓練參數為63744。
改進的模型以MNIST數據集的60000個訓練集和10000個測試集為基礎,以acc(訓練集準確率)、val_acc(測試集準確率)、loss(訓練集損失率)、val-loss(測試集損失率)為評估參數,對傳統的卷積網絡結構和改進的卷積網絡結構進行仿真實驗。實驗中數據訓練的迭代次數epoch為50次,每次的樣本數量batch_size為256,圖6和圖7分別為傳統的和改進的acc和val acc的結果。由于傳統的acc都未超過98%,因此圖6只顯示出了val_acc的值。傳統的最終的val_acc值為99.25%,改進的最終val_acc值為99. 54%;傳統的結構在迭代20次以后val acc的值才超過了99.1%,而改進模型在迭代9次以后val_acc的值就全部超過了99. 1%;因此采用改進后的卷積網絡結構收斂要快于改進前的速度,測試集的準確率要高于改進前的準確率。
圖8和圖9分別為傳統和改進的loss和valloss的結果。傳統的val_loss都高于2%,改進模型中迭代30次以后的val_loss值都低于2%,最終
表3為改進前和改進后結構實驗中val_acc和val_loss的數據,以迭代10次、20次、30次、40次和50次的樣本數據為例。從表3中可以看出,經過50次的迭代,采用卷積網絡結構比改進前卷積網絡結構的val_acc提高了0.29%、val loss降低了0. 77%。且在迭代第10次時,改進后比改進前的val_acc提升了0.29%,val loss降低了0.8%,說明采用改進的結構收斂速度要快于改進前的收斂速度。
4結論
基于Keras框架,對卷積神經網絡的結構進行改進,以MNIST數據集為基礎進行仿真實驗。實驗結果表明:改進的卷積神經網絡結構與改進前相比較,提高了訓練集和測試集上的準確率,最終在測試集上的準確率為99. 54%;降低了訓練集和測試集上的損失率,最終在測試集上的損失率為1.62%;且收斂速度快,訓練參數也少于改進前的訓練參數,對手寫數字識別的研究有重要意義。后續需要繼續研究結構和算法的改進,進一步提升測試集的準確率。