張 爍 張 榮
1(山西青年職業學院計算機系 山西 太原 030024)2(山西醫科大學計算機教學部 山西 太原 030001)
手寫數字辨識技術是指機器自動識別手寫阿拉伯數字技術,是機器學習、模式識別等領域非常重要的一個研究方向[1]。1998年,LeCun等[2]提出了一種基于梯度學習的CNN算法(LeNet-5),并應用于手寫數字辨識中。鑒于此,LeNet網絡當時應用于整個美國的郵政系統中,通過識別手寫郵政編碼來分類郵件。目前,在郵政編號識別、銀行單據自動錄入、財務報表自動錄入等識別系統中,都使用了手寫數字辨識技術[3]。近年來隨著大數據和人工智能技術的快速發展,人們不但對手寫數字的識別率提出了更高的要求,而且對算法訓練模型的時間也提出了更高的要求[4]。
目前,手寫數字辨識的方法[5]主要包括:結構識別法、統計識別法、深度學習法。結構識別法對相似數字有較強的識別能力,但是對于環境復雜的脫機數字識別往往識別正確率不高。統計識別法是指從大量的統計數據中提取出特征,然后通過決策函數進行分類。統計識別法通常有很強的抗干擾能力,但是往往識別的正確率也不理想。深度學習法的出現解決了識別率低的問題,并且通過改進深度學習網絡加快模型的訓練速度。在手寫數字辨識問題領域,深度學習法是目前理想的選擇。
卷積神經網絡(CNN)是深度學習模型中最為成功的網絡之一,并且在圖像識別領域有很好的識別效果。深度學習(包括CNN、RNN等)是端到端的學習,傳統機器學習往往通過模塊化的方法解決此類問題,分為圖像預處理、特征提取、設計分類器等子步驟完成任務。模塊化的基本思想是:將一個復雜、繁瑣的問題分成幾個簡單的子問題模塊來處理。但是,在處理每個子問題時,每個子問題都可能存在最優解,將這些子問題組合起來后,從全局來看,并不一定會得到最優解。對于深度學習是基于端到端的深層次網絡學習方式,整個流程并不進行子模塊的劃分,可以直接將原始數據輸入到模型中,整個學習過程完全交給深層次網絡模型,這樣最大的優點就是可以統籌全局獲得最優解。
卷積神經網絡由輸入層、卷積層、池化層、全連接層、輸出層構成,多個層可以看成一個復雜的函數fCNN,損失函數由參數正則化損失和數據損失構成,在訓練整個網絡時,按照損失函數將參數誤差反向傳播給整個模型的各個層次,達到參數更新的目的。整個訓練過程可以看成從原始數據向最終目標的直接擬合,中間各層次的作用為特征學習。CNN原理圖如圖1所示。可以看出,卷積層和池化層是整個CNN網絡的核心。
在卷積層中,通過可訓練的卷積核對上一層的輸入數據進行卷積操作,通常卷積核為3×3或5×5的矩陣,確定大小的卷積核按照規定的步長在上一層輸入數據做從左到右、從上到下的“滑動”操作,并輸出特征圖,每次卷積操作都可以提取出一種特征。如果在CNN網絡訓練時有n個卷積核就可以提取出圖像的n個特征。一般地,若一個三維張量xk為第k卷積層的輸入,滿足xk∈RHk×Wk×Dk,該層的卷積核為wk∈RH×W×Dk,卷積核有D個,則在同一數據位置上可以得到D維的卷積輸出,即在k+1層的特征矩陣輸入xk+1的通道數為D,可表示為:
(1)

在池化層中,主要的任務是對上一層特征圖進行下采樣處理,這是一種采樣較少的數據還保持原有重要信息的一種操作。常用的池化操作類型[6]分為平均池化(Average-Pooling)、最大池化(Max-Pooling)等。平均池化是在每次數據操作時,將池化核覆蓋區域的數值取平均值,可表示為:
(2)
最大池化是在每次對數據操作時,將池化核覆蓋區域的數據取最大值,可表示為:
(3)

如圖1所示,卷積層和池化層通常交替設置,圖像數據每經過一次卷積層和池化層后,都會提取出圖像特征。隨著交替次數的增大,提取的圖像特征逐步由低級特征到高級特征,最終形成對圖像的特征描述。最后通過CNN網絡的一個或多個全連接層輸出分類結果。
本文設計的CNN網絡有8層構成,分別是1個輸入層、2個卷積層、2個池化層、2個全連接層、1個輸出層。除去整個網絡的輸入層和輸出層,中間的2個卷積層、2個池化層、2個全連接層可以看成網絡的隱含層。CNN網絡結構如圖2所示。

圖2 CNN網絡結構圖
本文設計的CNN網絡結構中,輸入層INPUT包含28×28×1個神經元。C1層為卷積層,卷積核大小為5×5,32個卷積通道數,每個通道為14×14的矩陣。P1為池化層,包括32個池化通道,每個通道為14×14的矩陣,每個池化通道是由C1層經過大小為2×2、步長為2的最大池化后,通過ReLU激活函數進行非線性變化得到的。C2為卷積層,包括64個卷積通道數,每個通道為7×7的矩陣。P2為池化層,包括64個7×7的池化通道。每個池化通道是由C2層經過大小為2×2、步長為2的窗口進行最大池化后,通過ReLU激活函數進行非線性變化得到的。FC1為全連接層,有1 024個神經元,每個神經元和P2層的每個神經元相連接。FC2為全連接層,有10個神經元,每個神經元和FC1層的每個神經元相連接。最后通過SoftMax函數輸出分類結果。
一個理想的學習率要求一開始學習率的數值較大,并且有較快的收斂速度,然后隨著迭代次數的增加,學習率的數值慢慢衰減,最后達到最優解。本文設計的CNN網絡模型定義一個學習率適應這樣的過程,在實現批量隨機梯度下降法時,實現學習率的指數衰減。學習率指數衰減η(t)公式如下:
(4)
式中:η0為學習率初始值;t為迭代次數;r為衰減率。
為了減少全連接層網絡的復雜程度,本文設計的CNN網絡使用Dropout正則化方法。傳統的神經網絡中,每個神經元之間相互聯系,每一個神經元都會反向傳導后一個神經元的梯度信息并且相互之間聯系緊密,增加了網絡訓練的復雜度。Dropout可以降低神經元之間的緊密性和相互依賴,來提高算法的“泛化能力”,防止發生“過擬合”現象。
Dropout的原理是:在訓練時,對于網絡每一層的神經元,以p為概率隨機地丟掉一些神經元,也就是將這些神經元的權值w設為0;在測試時,將所有的神經元都設為激活狀態,但需要將訓練時丟掉的神經元權值w乘以(1-p)來保證訓練和測試階段各自權值有相同的期望。具體如圖3所示。

圖3 單個神經元的Dropout
本文在訓練CNN網絡時,使用了不同的參數優化方法來比較各個參數優化方法在訓練手寫數字圖像的性能。
(1) 批量隨機梯度下降法(mini-batch based SGD)SGD在進行樣本訓練時,在每一輪的訓練過程中,不對全部樣本進行訓練,只是隨機的選擇一個樣本進行訓練,這樣可以提高收斂速度。SGD可以分批計算訓練集的代價函數并用梯度對θ參數進行更新公式如下:
θ←θ-η·▽f(θ,xi,yi)
(5)
式中:f(θ,xi,yi)為代價函數;▽f(θ,xi,yi)是隨機選取樣本空間(xi,yi)的一點對θ的梯度;η為學習率。
(2) Momentum算法 Momentum算法借助了物理中動量的概念,模擬了運動物體時的慣性,在參數更新的時候在一定程度上保留了之前更新的方向,可以增加穩定性并且有較快的學習速度,θ參數更新公式如下:
vt=γ·vt-1+η·▽f(θ,xi,yi)
(6)
θ←θ-vt
(7)
式中:γ為動量;vi為i時的梯度變化。
(3) Adagrad算法 Adagrad算法的最大特點是可以在訓練時對學習率進行動態調整。當參數出現的頻率較低時,采用較大的學習率進行參數訓練;相反,參數出現的頻率較高時,采用較小的學習率進行參數訓練。在處理稀疏數據時,Adagrad算法有較好的訓練效果。θ參數更新公式如下:
(8)
式中:Gt為對角矩陣每個位置參數對應從第1輪訓練到第t輪訓練梯度的平方和;ε為平滑項,防止分式的分母為0,一般取值為1e-8。
(4) RMSprop算法 RMSprop算法是人工智能大師Hinton提出的一種自適應學習率動態調整算法,其目的是為了緩解Adagrad算法中學習率下降過快。Adagrad算法會累加之前所有的梯度平方,而RMSprop算法是計算之前所有梯度的平均值。θ參數更新公式如下:
(9)
式中:Et為對角矩陣每個位置參數對應從第1輪訓練到第t輪訓練梯度的均值。
(5) Adam算法 Adam算法也是一種學習率自適應算法,它利用梯度的一階矩陣和二階矩陣來動態調整參數的學習率。其最大的優點是校正的學習率,使每一次迭代都有一個確定的范圍,并且使參數更新比較平穩。θ參數更新公式如下:
(10)
式中:vt和mt分別是對代價函數求梯度的一階矩陣和二階矩陣。
基于本文提出的CNN模型訓練參數時,主要包括使用動態學習率,在網絡訓練時加入了Dropout方法和分別使用了批量隨機梯度下降法、Momentum算法、Adagrad算法、RMSprop算法、Adam算法進行參數優化。算法整體流程圖如圖4所示。

圖4 參數訓練算法流程圖
仿真實驗所用的數據集是美國國家標準與技術研究所編制的MNIST數據集,該數據集有含有0~9的手寫數字圖像,其中訓練集有60 000個樣本圖像,測試集有10 000個樣本圖像,訓練集數據標簽是“one-hot vector”形式,每張圖像大小為像素。每次訓練數據時,批次的大小為50,訓練的迭代次數為101次,分別使用了本文提及的5種參數優化方法進行訓練。仿真實驗硬件環境為Windows 8操作系統,第八代i7處理器3.60 GHz,16 GB內存,GeForce 1080Ti獨立顯卡;軟件環境為TensorFlow 1.4+Python 3.6。
本文是基于TensorFlow開源框架來構建CNN網絡模型實現手寫數字辨識的訓練過程,其CNN網絡模型參數具體配置如表1所示。

表1 本文CNN網絡模型參數
使用批量隨機梯度下降法和表1的CNN網絡模型參數配置來優化參數,學習率為動態指數衰減方式,實驗分析包括測試集準確率、訓練集代價函數錯誤率、迭代次數、訓練時間。如圖5所示,在訓練數據時,代價函數經過101次迭代后錯誤率為1.80%,但是測試集準確率只為75.60%,整個訓練時間為14 min 33 s。這說明使用批量隨機梯度下降法來優化參數時,整個網絡模型的泛化能力不強,發生了過擬合現象。

(a) 測試集正確率 (b) 訓練集錯誤率圖5 批量隨機梯度下降法訓練CNN網絡模型
分別使用Momentum算法、Adagrad算法、RMSprop算法、Adam算法對網絡參數進行優化來比較各個算法性能,如圖6和圖7所示。

(a) Momentum優化 測試集正確率 (b) Momentum優化訓練集錯誤率

(c) Adagrad優化 測試集正確率 (d) Adagrad優化訓練集錯誤率圖6 Momentum算法和Adagrad算法訓練CNN網絡模型

(c) Adam優化測試集正確率 (d) Adam優化訓練集錯誤率圖7 RMSprop算法、Adam算法訓練CNN網絡模型
通過圖6可以看出,Momentum算法和Adagrad算法在訓練數據時,訓練集經過101次訓練后錯誤率分別為1.70%和1.72%,但是測試集的準確率分別只有79.29%和82.20%,并且收斂速度較慢。訓練時間分別為15 min 20 s和15 min 13 s。從圖中可以看出Adagrad算法在訓練時震蕩劇烈。
通過圖7可以看出,RMSprop算法和Adam算法在訓練數據時,訓練集經過101次訓練后錯誤率分別為1.46%和1.47%,在測試集的準確率分別為99.40%和99.70%,訓練時間分別為15 min 58 s和15 min 42 s。這兩種算法在迭代次數較小的情況下,就已經達到較高的準確率,說明收斂速度較其他算法快。可以看出,使用RMSprop算法和Adam算法在測試集的準確率遠遠高于其他優化器算法,并且Adam算法比RMSprop算法的準確率高出0.3%,訓練時間少16 s。
各優化器算法總結如表2所示。

表2 各優化器算法比較

續表2
為了分析本文CNN網絡在測試集的識別性能,將識別準確率與其他手寫數字識別方法進行比較,如表3所示。

表3 幾種手寫數字識別方法比較
綜上所述,基于本文設計的CNN網絡結構, Adam算法在訓練集的錯誤率、測試集的準確率和收斂速度方面都優于其他優化器。各優化器在訓練集的錯誤率都較低,但使用批量隨機梯度下降法、Momentum算法和Adagrad算法驗證測試集準確率都表現不佳,說明這三種算法在優化網絡參數時,泛化能力不強。批量隨機梯度下降法參數優化時間最短,但是測試準確率最低;RMSprop算法訓練時間最長,測試準確率可以達到99.40%。所有算法訓練時間都在可接受范圍之內,并且與機器的配置有很大關系。基于本文設計的CNN網絡和Adam參數優化算法在相同數據集的情況下,測試集準確率高于文獻[3-5]中數字識別方法的準確率。
本文基于手寫數字辨識對CNN網絡模型參數優化進行研究。實驗結果表明:在本文設計的CNN網絡模型下,使用學習率動態衰減、Dropout正則化方法,RMSprop算法和Adam算法在參數優化方面收斂速度快、識別準確率高,測試集準確率可達99.40%和99.70%。下一步將優化CNN網絡模型,可將優化的CNN網絡模型使用RMSprop算法和Adam算法優化參數的方法應用在其他圖像識別中。