肖婷婷
(華東理工大學,上海201424)
隨著中國工業4.0的到來,手寫漢字識別HCCR應用變得廣泛。1996年Nag和Casey使用的模板匹配法識別出1000個印刷體,引起了HCCR研究的熱潮。高學等人在風險最小化準則上建立基于SVM的模型[1],并分析了識別手寫漢字遇到的特殊問題。手寫漢字具有隨意的特點,和印刷體的規范差距甚遠,采集合適的字體較困難,且字形復雜,有較多形似字。因此,傳統HCCR流程中的預處理、特征提取效果不好,而CNN能夠自動提取特征,適合處理非線性關系,對比而言是個好選擇[2]。有其他研究者改進了CNN,如Graham等,針對較少的數據集提出了解決方案,進行了知識路徑積分特征分析,充分利用了聯機時筆畫的時序信息,提高了準確率[3]。除CNN外,有其他深度學習的方法也獲得了好的效果,DBN更適合處理一維的數據,需要預訓練,這兩方面均弱于CNN,在HCCR方面,CNN效果更好[4],因而有人提出了CNN和DBN結合的方法[5]。手寫單字的技術已較成熟,但手寫文本行依舊是難點,LSTM和RNN適合提取序列信息,解決難題可能性大。
本文采用的是CASIA-HWDB數據集,其中脫機部分比如版本1.0和1.1總共有至少7599個漢字,而minist只要處理10個阿拉伯數字,可見漢字識別的難度之大。
先將數據轉成tfrecord格式,同時記錄標簽,圖像,圖像的長與寬。并且圖片尺寸并不該作為變量輸入到模型,故將所有圖像都轉為64×64像素。且圖片的每一個像素點的范圍是0~255,統一將其轉為以0為中心,1為半徑的分布,轉為zero-centered數據,加快收斂,若輸入全為正或負,導致梯度只往一個方向更新,階梯狀梯度會減慢收斂,會大大影響深度神經網絡。
Keras由Python編寫,是tensorflow結合CNTK后端等的高層API,降低了tensorflow編寫網絡的難度,Keras會自行根據是否有支持的顯卡切換CPU和GPU,有模塊化、簡單化、擴展性好的顯著優點。支持神經網絡的常見方法,比如數據的預處理,神經網絡訓練,評估和預測,支持Sequential模型和函數化模型。本文運用了層的堆疊Sequential模型,通過層的組合來搭建模型。Keras最大優點和開發重點,就是能快速搭建神經網絡。
多層神經網絡模型(MLP)是包括輸入層、隱藏層、輸出層的前饋神經網絡。MLP可看作一個有向圖,每兩個神經元之間連接的權重是邊權,輸入層接受特征的輸入,整體是從輸入層往輸出層方向,直到傳輸到輸出層。誤差反向傳播BP算法用權重梯度更新權重,而權重梯度根據輸出層預測值和實際標簽的偏差,利用鏈式求導法則求偏差對權重的導數,中間變量為隱藏層的各輸出變量。
以一個神經元為例,若x為輸入列向量,w為權重向量,b為偏置,y為輸出,則:

其中M為x的行數,g(x)代表激活函數,有利于處理非線性的問題。激活函數的種類如表1。sigmoid導數大于0,最大為0.25,至少每一層會被縮小1/4,特別是當sigmoid輸入過大或過小,導數趨于0,梯度減小快。導數涉及到冪的運算,深層網絡耗時增加。輸出數據非0中心,會導致后續梯度下降時呈現階梯狀。tanh的函數圖像是中心對稱的,但仍存在sigmoid另兩個問題。relu正的輸入數據的梯度為1,緩解了梯度消失的問題,不涉及冪運算,負數的梯度為0,降低了過擬合的可能性,但造成了一定可能性的梯度消失,因而提出了leaky relu等激活函數。

表1 不同的激活函數
本文構建網絡主要思想是局部感受野,權重共享,池化三部分。局部感受野是使用一個卷積核和原圖像部分(尺寸和卷積核的大小一致)進行卷積,此處涉及的局部區域,一個卷積核一次卷積只提取了部分區域的特征。而同一個卷積核以一定的步長值沿著x軸和y軸滑動,遍歷了整個圖片,代表圖片的所有小區域共享一個卷積核,卷積核中的元素就是權重和偏移量。手寫字識別只提取一種特征是不夠的,提取不同特征就需要不同的卷積核,卷積核的數值不同,代表對某個區域的敏感度不同。而權重共享最大的優點就是大大減少了模型參數,減小了計算量,對深層網絡更有利。池化是某個區域取最大值或者均等值將區域的信息轉為一個數值,對卷積層的輸出進行了簡化。池化保留了區域相對整體的信息,但喪失了更精確的位置數據。
使用tensorflow2.1框架,cuda10.1版本并行處理,cudnn7,英偉達GTX1050顯卡運算。
batch_size設為512,訓練81代,得出損失大小和訓練集的準確率。使用softmax激活,將輸出層的范圍從(-∞,+∞)轉為(0,1),是每個樣本屬于各類的概率。將某個樣本的特征量作為輸入,得到T個類別分別對應的概率,概率最大的類別作為預測標簽。實驗使用了一個batch的數據平均損失來反向傳播,輸出了準確率。類別使用onehot編碼,只有下標為真實標簽的值1,其他均為0,交叉熵作為損失指標。
錯誤預測比正確損失大,較大錯誤程度的預測比小的損失更大。網絡總體是為了訓練出權重矩陣和偏置,使盡量多的樣本概率最大的類別是真實類別。模型的優化器選取了RMSProp,緩解了山谷震蕩問題。山谷點的鄰域內,即使橫軸仍在往一個方向更新,但是縱軸卻是來回震蕩,甚至可能無法收斂,需要降低縱軸更新速度。w為權重,α為學習率,β為平滑系數,ε為極小值,公式如下:

β起平滑作用,震蕩大的方向,s值大,步長減小,震蕩小的方向則增加了步長。β通常用0.999,ε典型值為10-8。
分析圖1得到,第一層卷積使用了relu激活函數的CNN模型起初損失函數減少快,epochs越大,損失函數降低得越平緩,最終收斂,訓練集的準確率達到98.42%。激活函數換為sigmoid,損失函數呈現略微上升的趨勢,迭代了81代后未收斂,準確率始終小于1%,出現了gradient vanishing現象。tanh激活函數下,收斂但在經過相同代數,比relu的損失大。一方面,sigmoid導數最大值為0.25,而tanh導數最大值為1,故使用sigmoid激活函數更易梯度消失。另一方面,relu正數輸入的導數為1,比tanh多數情況大,故更快收斂。實驗得到損失誤差和準確率如表2,sigmoid損失最大,relu最小。

圖1 使用不同激活函數的CNN網絡訓練過程

表2 激活函數效果對比
本文將HWDB1.1數據集預處理后,構建了一個簡單而有效的卷積神經網絡,使用softmax loss計算損失,模型優化使用RMSProp,根據第一層卷積層的不同激活函數,觀察訓練集的準確率。實驗表明,relu激活函數在訓練同等epochs下,分類效果最好。sigmoid易出現梯度消失的問題,可使用batch normalization,改用leaky relu等激活函數。