張趁香 陳黃宇
關(guān)鍵詞:手寫(xiě)數(shù)字識(shí)別;LeNet-5;深度學(xué)習(xí);卷積神經(jīng)網(wǎng)絡(luò);激活函數(shù)
0 引言
隨著人工智能及相關(guān)技術(shù)的發(fā)展,信息存儲(chǔ)和傳遞方式的改變?cè)谝欢ǔ潭壬辖鉀Q了人類面臨的多種問(wèn)題,例如信息因距離遠(yuǎn)而傳輸緩慢,或信息過(guò)于龐大或復(fù)雜而難以傳遞的困難。數(shù)字識(shí)別技術(shù),作為一種新興的、利用計(jì)算機(jī)代替人類識(shí)別手寫(xiě)數(shù)字的技術(shù),已經(jīng)得到了廣泛的應(yīng)用。從航空航天、工業(yè)制造、鐵路裝備到精密儀器、芯片制造、顯微成像,各行各業(yè)都有數(shù)字的身影。本文旨在設(shè)計(jì)一種能夠快速、準(zhǔn)確識(shí)別數(shù)字的算法,并將其實(shí)際運(yùn)用到各領(lǐng)域中解決問(wèn)題。
1 神經(jīng)網(wǎng)絡(luò)方法解決手寫(xiě)數(shù)字識(shí)別問(wèn)題現(xiàn)狀
目前,大量的神經(jīng)網(wǎng)絡(luò)方法被利用于解決手寫(xiě)數(shù)字識(shí)別問(wèn)題。傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)是一種機(jī)器學(xué)習(xí)方法,它通過(guò)正向的神經(jīng)元計(jì)算預(yù)測(cè)值與實(shí)際樣本之間的偏差,并通過(guò)反向傳播機(jī)制(BP) 來(lái)更新神經(jīng)網(wǎng)絡(luò)中的參數(shù),從而達(dá)到訓(xùn)練模型的目的,以準(zhǔn)確判斷手寫(xiě)數(shù)字類型[1]。BP神經(jīng)網(wǎng)絡(luò)自提出以來(lái),因其強(qiáng)大的非線性擬合能力而被廣泛應(yīng)用。然而,該網(wǎng)絡(luò)結(jié)構(gòu)中的參數(shù)優(yōu)化方法存在不足,在實(shí)際訓(xùn)練中,很難實(shí)現(xiàn)有效的收斂性和訓(xùn)練效率。此外,由于硬件資源的限制,訓(xùn)練效率進(jìn)一步降低,在較大規(guī)模的網(wǎng)絡(luò)中難以提供充分的運(yùn)算資源進(jìn)行參數(shù)優(yōu)化。
為了更好地識(shí)別和分類,常采用卷積神經(jīng)網(wǎng)絡(luò)(CNN) 。該網(wǎng)絡(luò)是基于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)改進(jìn)后設(shè)計(jì)的,結(jié)合了人類大腦理解視覺(jué)圖像的方式[2]。相比于原有的網(wǎng)絡(luò)結(jié)構(gòu),卷積神經(jīng)網(wǎng)絡(luò)提出了一種類似于人類識(shí)別事物時(shí)的觀測(cè)方式:感受野(receptive field) 。首先,它通過(guò)卷積運(yùn)算來(lái)捕捉各個(gè)部位的特征,把注意力集中在一個(gè)特定區(qū)域上。其次,權(quán)重共享的核心在于,相同的特征抽取方法可以應(yīng)用于其他圖像。最后,在卷積層后加入了一個(gè)池化層,它可以從卷積運(yùn)算中提取特征值,進(jìn)一步減少參數(shù)量和特征向量的維度,從而提高學(xué)習(xí)效率。由于卷積神經(jīng)網(wǎng)絡(luò)更適合處理圖像數(shù)據(jù),BP神經(jīng)網(wǎng)絡(luò)通常將圖像信號(hào)展開(kāi)為一維信號(hào),這一過(guò)程會(huì)導(dǎo)致圖像中各像素之間的關(guān)聯(lián)信息丟失;而卷積神經(jīng)網(wǎng)絡(luò)則直接將原始圖像作為輸入,或?qū)D像進(jìn)行預(yù)處理,以保持圖像中鄰近像素的關(guān)聯(lián)性。
2 改進(jìn)LeNet-5的手寫(xiě)數(shù)字識(shí)別
盡管BP神經(jīng)網(wǎng)絡(luò)在手寫(xiě)數(shù)字識(shí)別領(lǐng)域未能達(dá)到特別高的識(shí)別精度,基于卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)的手寫(xiě)數(shù)字識(shí)別系統(tǒng)LeNet-5在MNIST數(shù)據(jù)集上的測(cè)試誤差僅為0.94%,相比之前的算法在精度方面已有一定提升。然而,傳統(tǒng)的LeNet-5模型采用的Sigmoid激活函數(shù)[3]可能在實(shí)際模型訓(xùn)練過(guò)程中導(dǎo)致梯度消失現(xiàn)象。此外,網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)也不足以訓(xùn)練出高精度的模型。
2.1 對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行變更
1) 原模型中采用Sigmoid函數(shù)作為激活函數(shù),經(jīng)過(guò)BP神經(jīng)網(wǎng)絡(luò)的實(shí)驗(yàn)驗(yàn)證,ReLU函數(shù)具有更佳的性能,因此采用ReLU函數(shù)替代原有的Sigmoid函數(shù)。
2) 在LeNet-5中,第二個(gè)卷積層與上一層之間采用了特殊連接方式,本文改為在所有特征圖上直接進(jìn)行卷積,以簡(jiǎn)化網(wǎng)絡(luò)模型。
3) 在最后的全連接層和輸出層之間加入dropout層,以防止過(guò)擬合。
4) 原LeNet-5模型使用歐式徑向基函數(shù)進(jìn)行分類,改為采用softmax分類函數(shù)進(jìn)行分類。
2.2 改進(jìn)LeNet-5模型
改進(jìn)后的LeNet-5同樣通過(guò)MNIST 數(shù)據(jù)集進(jìn)行訓(xùn)練和測(cè)試。在此過(guò)程中,模型對(duì)原有圖像進(jìn)行預(yù)處理,將原本的28×28圖像轉(zhuǎn)換為32×32圖像。這一變化旨在避免在卷積核與原始圖像之間的信息丟失。與其他神經(jīng)網(wǎng)絡(luò)相似,該算法采用基于反向傳播的隨機(jī)梯度下降方法更新權(quán)重。與BP神經(jīng)網(wǎng)絡(luò)相比,由于卷積層與其輸入之間是稀疏連接的,并且每個(gè)卷積核只提取原圖不同位置的相同特征(即權(quán)值共享),這種處理顯著減少了訓(xùn)練所需的參數(shù)數(shù)量。此外,通過(guò)增加卷積核的數(shù)量可以提取更多的特征。改進(jìn)LeNet-5網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
1) 根據(jù)網(wǎng)絡(luò)中對(duì)卷積運(yùn)算的處理方式,若輸入的特征圖大小為28×28,且未采用任何填充策略,且步長(zhǎng)設(shè)為1,則使用5×5大小的卷積濾波器執(zhí)行一次卷積后,生成的特征圖將變?yōu)?4×24。同樣,若使用3×3大小的卷積濾波器進(jìn)行同樣的卷積,將產(chǎn)生一個(gè)26×26 大小的特征圖。最后,再次使用3×3的卷積濾波器進(jìn)行卷積,最終生成的特征圖大小仍為24×24。從這些數(shù)據(jù)可以明顯看到,無(wú)論是否重復(fù)使用3×3的卷積濾波器,結(jié)果得到的特征圖尺寸都是相同的。這一結(jié)論可以通過(guò)觀察表1中的參數(shù)變化來(lái)得出。
2) 需要增加同一層中的卷積核數(shù)量。在每個(gè)卷積層中,應(yīng)使用32個(gè)卷積核進(jìn)行計(jì)算。這樣做可以增加每層輸出的特征圖數(shù)量,從而增強(qiáng)模型的特征提取能力,進(jìn)而提升模型性能。
3) 采用ReLU激活方式替代了Sigmoid激活方式。通過(guò)選擇適當(dāng)?shù)募せ顧C(jī)制,可以顯著提升模型的表現(xiàn)力。從圖2可以看出,在相同的學(xué)習(xí)條件下,相較于Sigmoid激活方式,ReLU激活策略能夠減少訓(xùn)練回合次數(shù),并將誤差值降低至0.25。
4) 利用空間金字塔池化(Spatial Pyramid Pooling) 技術(shù)改進(jìn)LeNet-5中的S4池化層,以減小池化過(guò)程對(duì)特征值的影響。具體來(lái)說(shuō),圖3展示了低層次和高層次的立方體分別表示的是卷積層產(chǎn)生的特征圖。接著,這些特征圖被傳遞到三個(gè)不同尺寸的池化層(4×4、2×2和1×1) ,最終將這三個(gè)結(jié)果合并成一個(gè)21維的向量,然后傳遞到全連接層。
5) 采用全連接層替代LeNet-5中的C5層。通常情況下,全連接層被置于模型末端,以匯總信息并防止因過(guò)分關(guān)注局部信息而導(dǎo)致的分類誤差,這有助于提升網(wǎng)絡(luò)的穩(wěn)健性。通過(guò)優(yōu)化,發(fā)現(xiàn)在前三個(gè)卷積層之后,即使不減少卷積層數(shù)量,也可以用全連接層取代C5 層,從而進(jìn)一步增強(qiáng)模型的穩(wěn)定性和分類準(zhǔn)確率。
在網(wǎng)絡(luò)訓(xùn)練過(guò)程中,使用隨機(jī)優(yōu)化算法初始化卷積神經(jīng)網(wǎng)絡(luò)中所有卷積核的權(quán)值wij,旨在為正在學(xué)習(xí)的數(shù)據(jù)中的輸入到輸出的特定映射函數(shù)找到足夠好的權(quán)重集[4]。隨后,將輸入圖像送入卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行前向傳播,以獲取網(wǎng)絡(luò)的輸出。通過(guò)計(jì)算損失函數(shù)來(lái)衡量網(wǎng)絡(luò)輸出與真實(shí)標(biāo)簽之間的差異,并通過(guò)反向傳播將這一差異從輸出層傳遞回上一層,以此初始化網(wǎng)絡(luò)中的卷積核參數(shù)值。接著,選擇優(yōu)化器算法生成新的樣本,并反復(fù)更新網(wǎng)絡(luò)中的參數(shù),從而使損失函數(shù)逐漸減小。
2.3 多維卷積運(yùn)算
由于原始輸入圖像包含RGB三個(gè)通道的數(shù)據(jù),因此卷積核需要具有相匹配的深度,以便更有效地對(duì)特征進(jìn)行組合。多維卷積有兩種方式:一種是全卷積,即同一層的所有特征圖都參與卷積運(yùn)算,但這種方式并沒(méi)有突出特征組合的特殊性;另一種是選擇性卷積,在這種方式中,人為地約束了哪些特征圖進(jìn)行組合,使得某些卷積核只關(guān)注部分特征之間的組合,而不是全自動(dòng)地學(xué)習(xí)該組合哪些特征。在LeNet-5中,C3層和S2層采用選擇性卷積,目的是讓模型只選取特定部分的特征進(jìn)行組合,這樣同時(shí)也降低了參數(shù)數(shù)量,簡(jiǎn)化了網(wǎng)絡(luò)模型[5]。多維卷積運(yùn)算的示意圖如圖2 所示。
2.4 池化和激活函數(shù)
池化可以對(duì)數(shù)據(jù)進(jìn)行降維,同時(shí)可以縮小數(shù)據(jù)量,減小實(shí)際訓(xùn)練過(guò)程中的壓力。實(shí)驗(yàn)證明,池化操作不僅不會(huì)丟失特征,反而可以減少參數(shù),使得訓(xùn)練速度加快。此外,特征向量維數(shù)的降低有利于分類器的訓(xùn)練。池化操作和卷積的相同之處在于都是通過(guò)一個(gè)滑動(dòng)窗口對(duì)輸入進(jìn)行運(yùn)算,然后再加上一個(gè)偏置項(xiàng);不同之處在于滑動(dòng)窗口的選擇以及其中參數(shù)的確定。
按照運(yùn)行方式,池化可以劃分為最大池化、平均池化和隨機(jī)池化。在最大池化過(guò)程中,通過(guò)池化操作,得到的結(jié)果是滑動(dòng)窗口覆蓋區(qū)域內(nèi)的最大單元。在平均池化中,通過(guò)計(jì)算,可以獲得由滑動(dòng)窗口所涵蓋的單元的平均值。在池化具體操作過(guò)程中,一般選取池化窗口時(shí)需要使窗口大小能被原圖大小整除,即當(dāng)滑動(dòng)窗口以自身大小為步長(zhǎng)在特征圖上滑動(dòng)后,能夠覆蓋特征圖中所有的像素點(diǎn)。例如,28×28大小的特征圖經(jīng)過(guò)2×2窗口池化之后,得到的特征圖大小為(28/2) ×(28/2) ,即14×14。由此可以明顯地看出,特征圖在原基礎(chǔ)上被抽象,且特征圖的維數(shù)大大降低,網(wǎng)絡(luò)訓(xùn)練速度自然會(huì)有所提升。
激活函數(shù)主要起到“映射功能”。在神經(jīng)網(wǎng)絡(luò)中,大多數(shù)操作都是線性的,為了適應(yīng)某些非線性問(wèn)題,必須使用激活函數(shù)。激活函數(shù)大體可以分為兩大類:
1) 飽和激活函數(shù):sigmoid、tanh。
2) 非飽和激活函數(shù):ReLU、Leaky ReLU等。
使用“非飽和激活函數(shù)”的優(yōu)勢(shì)主要有:它能在一定程度上解決反向傳播過(guò)程中的計(jì)算問(wèn)題,例如梯度消失的問(wèn)題。由于其本身的特點(diǎn)及計(jì)算的非線性等特征,可以加快運(yùn)算速度。因此,在本網(wǎng)絡(luò)中采用的是Leaky ReLU。其數(shù)學(xué)表達(dá)式為:
不同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)效果各異。在每次訓(xùn)練過(guò)程中,隱含層的神經(jīng)元會(huì)以一定概率隨機(jī)失活,因此無(wú)法保證每?jī)蓚€(gè)隱含層神經(jīng)元在每次訓(xùn)練中都同時(shí)出現(xiàn)。這種機(jī)制使得權(quán)值更新不再依賴于具有固定關(guān)系的隱含層神經(jīng)元的共同作用,避免了某些特征僅在其他特定特征出現(xiàn)時(shí)才有效的情況[6]。由于每次訓(xùn)練時(shí)部分神經(jīng)元不參與權(quán)值更新,實(shí)際上每次訓(xùn)練的都是一個(gè)不同的網(wǎng)絡(luò)。
3 GUI 界面設(shè)計(jì)及實(shí)驗(yàn)
3.1 GUI 界面設(shè)計(jì)
GUI 界面是通過(guò)Python 自帶的PyQt 包開(kāi)發(fā)的。PyQt是一個(gè)強(qiáng)大的Python工具包,它不僅可以用于界面開(kāi)發(fā),還可以進(jìn)行簡(jiǎn)單的程序可視化展示。主要功能及其說(shuō)明如表3所示。
3.2 實(shí)驗(yàn)設(shè)計(jì)
LeNet-5手寫(xiě)數(shù)字識(shí)別訓(xùn)練步驟如下:
1) 將遵循正態(tài)分布的120維隨機(jī)向量傳送至生成器的全連接層,然后利用隨機(jī)優(yōu)化算法為各種卷積核選擇參數(shù)wij。在卷積神經(jīng)網(wǎng)絡(luò)中,所有卷積核權(quán)重均被初始化,并輸出7×7×512個(gè)神經(jīng)元,以便為正在學(xué)習(xí)的數(shù)據(jù)中的輸入到輸出的特定映射函數(shù)找到足夠好的權(quán)重集。經(jīng)過(guò)ReLU激活函數(shù)的非線性映射后,并進(jìn)行尺度歸一化處理,輸出至第一個(gè)轉(zhuǎn)置卷積層。
2) 將輸入數(shù)據(jù)傳送到卷積神經(jīng)網(wǎng)絡(luò)中進(jìn)行前向傳播,運(yùn)行Step設(shè)置為1,補(bǔ)零參數(shù)設(shè)為flag,然后進(jìn)行卷積運(yùn)算,輸出256個(gè)7×7大小的張量。經(jīng)過(guò)ReLU激活函數(shù)的非線性映射后,并進(jìn)行尺度歸一化處理,輸出至第二個(gè)轉(zhuǎn)置卷積層。
3) 將輸入數(shù)據(jù)傳送到卷積神經(jīng)網(wǎng)絡(luò)中進(jìn)行前向傳播,運(yùn)行Step設(shè)置為1,補(bǔ)零參數(shù)設(shè)為flag,然后進(jìn)行卷積運(yùn)算,輸出128個(gè)14×14大小的張量。經(jīng)過(guò)ReLU 激活函數(shù)的非線性映射后,并進(jìn)行尺度歸一化處理,輸出至第三個(gè)轉(zhuǎn)置卷積層。
4) 將輸入數(shù)據(jù)傳送到卷積神經(jīng)網(wǎng)絡(luò)中進(jìn)行前向傳播,運(yùn)行Step設(shè)置為2,補(bǔ)零參數(shù)設(shè)為flag,然后進(jìn)行卷積運(yùn)算,輸出1個(gè)56×56大小的張量。經(jīng)過(guò)ReLU激活函數(shù)的非線性映射后,輸出生成對(duì)象。
5) 重復(fù)以上判別過(guò)程,計(jì)算損失函數(shù)以衡量網(wǎng)絡(luò)輸出與真實(shí)標(biāo)簽之間的差異,將這個(gè)差異通過(guò)網(wǎng)絡(luò)反向傳播,更新網(wǎng)絡(luò)中的參數(shù)。一方面的數(shù)據(jù)來(lái)源于MNIST數(shù)據(jù)集,另一方面的數(shù)據(jù)來(lái)源于生成器輸入的數(shù)據(jù)。將兩種數(shù)據(jù)輸入的損失值相加后,對(duì)判別器的模型進(jìn)行優(yōu)化。
3.3 實(shí)驗(yàn)結(jié)果對(duì)比分析
實(shí)驗(yàn)采用批量梯度下降法進(jìn)行網(wǎng)絡(luò)權(quán)值的更新,每一批次的樣本數(shù)為120個(gè),設(shè)置循環(huán)次數(shù)為20次,則權(quán)值更新次數(shù)為60000/120×20=10000次,在訓(xùn)練過(guò)程中,每經(jīng)過(guò)500次迭代就將訓(xùn)練的中間網(wǎng)絡(luò)用于測(cè)試集進(jìn)行測(cè)試。由于訓(xùn)練剛開(kāi)始的時(shí)候,權(quán)值是隨機(jī)初始化,模型在測(cè)試集上的效果不具備代表性,故而沒(méi)有進(jìn)行記錄。
Minst數(shù)據(jù)集預(yù)測(cè)部分?jǐn)?shù)據(jù)結(jié)果直觀展示圖如圖4所示。
根據(jù)LeNet-5的結(jié)構(gòu)特點(diǎn),本文對(duì)其結(jié)構(gòu)進(jìn)行了一些改變:替換激活函數(shù)、增加卷積核的數(shù)量以及加入dropout。實(shí)驗(yàn)結(jié)果證明了這些結(jié)構(gòu)改動(dòng)的有效性。通過(guò)對(duì)誤分類樣本的觀察分析,發(fā)現(xiàn)網(wǎng)絡(luò)對(duì)于單一的MNIST訓(xùn)練集的泛化能力和精度已經(jīng)難以進(jìn)一步提升。為了進(jìn)一步提高網(wǎng)絡(luò)性能,可以增加樣本輸入量。針對(duì)測(cè)試集中某些類別存在的嚴(yán)重形變,可以對(duì)訓(xùn)練集中的樣本進(jìn)行適度的扭曲形變后再輸入網(wǎng)絡(luò)進(jìn)行訓(xùn)練,這種方法變相地增加了訓(xùn)練樣本的數(shù)量,也有助于增強(qiáng)網(wǎng)絡(luò)的泛化能力。
4 結(jié)束語(yǔ)
首先,本研究對(duì)各種隱藏層參數(shù)和激活函數(shù)的變化進(jìn)行了對(duì)比,比較了不同激活函數(shù)的利弊,發(fā)現(xiàn)以ReLU為激活函數(shù)的網(wǎng)絡(luò)能夠快速收斂;在過(guò)度擬合的條件下,添加dropout能夠稍微減輕過(guò)度擬合的問(wèn)題。其次,本研究通過(guò)利用改良的LeNet-5架構(gòu)進(jìn)行手寫(xiě)數(shù)字識(shí)別的方法進(jìn)行了探索。研究結(jié)果表明,隨著卷積核數(shù)量的增加,雖然可以提高特征的維度,從而提升網(wǎng)絡(luò)的整體性能,但卷積核的數(shù)量并非越多越好;過(guò)多的卷積核不僅會(huì)導(dǎo)致巨大的計(jì)算開(kāi)銷,還可能引起網(wǎng)絡(luò)的過(guò)度擬合。最后,通過(guò)改變LeNet-5的結(jié)構(gòu),將錯(cuò)誤識(shí)別率降低到了0.86%。