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