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