肖婷婷
(華東理工大學(xué),上海201424)
隨著中國工業(yè)4.0的到來,手寫漢字識別HCCR應(yīng)用變得廣泛。1996年Nag和Casey使用的模板匹配法識別出1000個印刷體,引起了HCCR研究的熱潮。高學(xué)等人在風(fēng)險最小化準(zhǔn)則上建立基于SVM的模型[1],并分析了識別手寫漢字遇到的特殊問題。手寫漢字具有隨意的特點,和印刷體的規(guī)范差距甚遠,采集合適的字體較困難,且字形復(fù)雜,有較多形似字。因此,傳統(tǒng)HCCR流程中的預(yù)處理、特征提取效果不好,而CNN能夠自動提取特征,適合處理非線性關(guān)系,對比而言是個好選擇[2]。有其他研究者改進了CNN,如Graham等,針對較少的數(shù)據(jù)集提出了解決方案,進行了知識路徑積分特征分析,充分利用了聯(lián)機時筆畫的時序信息,提高了準(zhǔn)確率[3]。除CNN外,有其他深度學(xué)習(xí)的方法也獲得了好的效果,DBN更適合處理一維的數(shù)據(jù),需要預(yù)訓(xùn)練,這兩方面均弱于CNN,在HCCR方面,CNN效果更好[4],因而有人提出了CNN和DBN結(jié)合的方法[5]。手寫單字的技術(shù)已較成熟,但手寫文本行依舊是難點,LSTM和RNN適合提取序列信息,解決難題可能性大。
本文采用的是CASIA-HWDB數(shù)據(jù)集,其中脫機部分比如版本1.0和1.1總共有至少7599個漢字,而minist只要處理10個阿拉伯?dāng)?shù)字,可見漢字識別的難度之大。
先將數(shù)據(jù)轉(zhuǎn)成tfrecord格式,同時記錄標(biāo)簽,圖像,圖像的長與寬。并且圖片尺寸并不該作為變量輸入到模型,故將所有圖像都轉(zhuǎn)為64×64像素。且圖片的每一個像素點的范圍是0~255,統(tǒng)一將其轉(zhuǎn)為以0為中心,1為半徑的分布,轉(zhuǎn)為zero-centered數(shù)據(jù),加快收斂,若輸入全為正或負,導(dǎo)致梯度只往一個方向更新,階梯狀梯度會減慢收斂,會大大影響深度神經(jīng)網(wǎng)絡(luò)。
Keras由Python編寫,是tensorflow結(jié)合CNTK后端等的高層API,降低了tensorflow編寫網(wǎng)絡(luò)的難度,Keras會自行根據(jù)是否有支持的顯卡切換CPU和GPU,有模塊化、簡單化、擴展性好的顯著優(yōu)點。支持神經(jīng)網(wǎng)絡(luò)的常見方法,比如數(shù)據(jù)的預(yù)處理,神經(jīng)網(wǎng)絡(luò)訓(xùn)練,評估和預(yù)測,支持Sequential模型和函數(shù)化模型。本文運用了層的堆疊Sequential模型,通過層的組合來搭建模型。Keras最大優(yōu)點和開發(fā)重點,就是能快速搭建神經(jīng)網(wǎng)絡(luò)。
多層神經(jīng)網(wǎng)絡(luò)模型(MLP)是包括輸入層、隱藏層、輸出層的前饋神經(jīng)網(wǎng)絡(luò)。MLP可看作一個有向圖,每兩個神經(jīng)元之間連接的權(quán)重是邊權(quán),輸入層接受特征的輸入,整體是從輸入層往輸出層方向,直到傳輸?shù)捷敵鰧?。誤差反向傳播BP算法用權(quán)重梯度更新權(quán)重,而權(quán)重梯度根據(jù)輸出層預(yù)測值和實際標(biāo)簽的偏差,利用鏈?zhǔn)角髮?dǎo)法則求偏差對權(quán)重的導(dǎo)數(shù),中間變量為隱藏層的各輸出變量。
以一個神經(jīng)元為例,若x為輸入列向量,w為權(quán)重向量,b為偏置,y為輸出,則:
其中M為x的行數(shù),g(x)代表激活函數(shù),有利于處理非線性的問題。激活函數(shù)的種類如表1。sigmoid導(dǎo)數(shù)大于0,最大為0.25,至少每一層會被縮小1/4,特別是當(dāng)sigmoid輸入過大或過小,導(dǎo)數(shù)趨于0,梯度減小快。導(dǎo)數(shù)涉及到冪的運算,深層網(wǎng)絡(luò)耗時增加。輸出數(shù)據(jù)非0中心,會導(dǎo)致后續(xù)梯度下降時呈現(xiàn)階梯狀。tanh的函數(shù)圖像是中心對稱的,但仍存在sigmoid另兩個問題。relu正的輸入數(shù)據(jù)的梯度為1,緩解了梯度消失的問題,不涉及冪運算,負數(shù)的梯度為0,降低了過擬合的可能性,但造成了一定可能性的梯度消失,因而提出了leaky relu等激活函數(shù)。
表1 不同的激活函數(shù)
本文構(gòu)建網(wǎng)絡(luò)主要思想是局部感受野,權(quán)重共享,池化三部分。局部感受野是使用一個卷積核和原圖像部分(尺寸和卷積核的大小一致)進行卷積,此處涉及的局部區(qū)域,一個卷積核一次卷積只提取了部分區(qū)域的特征。而同一個卷積核以一定的步長值沿著x軸和y軸滑動,遍歷了整個圖片,代表圖片的所有小區(qū)域共享一個卷積核,卷積核中的元素就是權(quán)重和偏移量。手寫字識別只提取一種特征是不夠的,提取不同特征就需要不同的卷積核,卷積核的數(shù)值不同,代表對某個區(qū)域的敏感度不同。而權(quán)重共享最大的優(yōu)點就是大大減少了模型參數(shù),減小了計算量,對深層網(wǎng)絡(luò)更有利。池化是某個區(qū)域取最大值或者均等值將區(qū)域的信息轉(zhuǎn)為一個數(shù)值,對卷積層的輸出進行了簡化。池化保留了區(qū)域相對整體的信息,但喪失了更精確的位置數(shù)據(jù)。
使用tensorflow2.1框架,cuda10.1版本并行處理,cudnn7,英偉達GTX1050顯卡運算。
batch_size設(shè)為512,訓(xùn)練81代,得出損失大小和訓(xùn)練集的準(zhǔn)確率。使用softmax激活,將輸出層的范圍從(-∞,+∞)轉(zhuǎn)為(0,1),是每個樣本屬于各類的概率。將某個樣本的特征量作為輸入,得到T個類別分別對應(yīng)的概率,概率最大的類別作為預(yù)測標(biāo)簽。實驗使用了一個batch的數(shù)據(jù)平均損失來反向傳播,輸出了準(zhǔn)確率。類別使用onehot編碼,只有下標(biāo)為真實標(biāo)簽的值1,其他均為0,交叉熵作為損失指標(biāo)。
錯誤預(yù)測比正確損失大,較大錯誤程度的預(yù)測比小的損失更大。網(wǎng)絡(luò)總體是為了訓(xùn)練出權(quán)重矩陣和偏置,使盡量多的樣本概率最大的類別是真實類別。模型的優(yōu)化器選取了RMSProp,緩解了山谷震蕩問題。山谷點的鄰域內(nèi),即使橫軸仍在往一個方向更新,但是縱軸卻是來回震蕩,甚至可能無法收斂,需要降低縱軸更新速度。w為權(quán)重,α為學(xué)習(xí)率,β為平滑系數(shù),ε為極小值,公式如下:
β起平滑作用,震蕩大的方向,s值大,步長減小,震蕩小的方向則增加了步長。β通常用0.999,ε典型值為10-8。
分析圖1得到,第一層卷積使用了relu激活函數(shù)的CNN模型起初損失函數(shù)減少快,epochs越大,損失函數(shù)降低得越平緩,最終收斂,訓(xùn)練集的準(zhǔn)確率達到98.42%。激活函數(shù)換為sigmoid,損失函數(shù)呈現(xiàn)略微上升的趨勢,迭代了81代后未收斂,準(zhǔn)確率始終小于1%,出現(xiàn)了gradient vanishing現(xiàn)象。tanh激活函數(shù)下,收斂但在經(jīng)過相同代數(shù),比relu的損失大。一方面,sigmoid導(dǎo)數(shù)最大值為0.25,而tanh導(dǎo)數(shù)最大值為1,故使用sigmoid激活函數(shù)更易梯度消失。另一方面,relu正數(shù)輸入的導(dǎo)數(shù)為1,比tanh多數(shù)情況大,故更快收斂。實驗得到損失誤差和準(zhǔn)確率如表2,sigmoid損失最大,relu最小。
圖1 使用不同激活函數(shù)的CNN網(wǎng)絡(luò)訓(xùn)練過程
表2 激活函數(shù)效果對比
本文將HWDB1.1數(shù)據(jù)集預(yù)處理后,構(gòu)建了一個簡單而有效的卷積神經(jīng)網(wǎng)絡(luò),使用softmax loss計算損失,模型優(yōu)化使用RMSProp,根據(jù)第一層卷積層的不同激活函數(shù),觀察訓(xùn)練集的準(zhǔn)確率。實驗表明,relu激活函數(shù)在訓(xùn)練同等epochs下,分類效果最好。sigmoid易出現(xiàn)梯度消失的問題,可使用batch normalization,改用leaky relu等激活函數(shù)。