高春庚,孫建國
(濟(jì)源職業(yè)技術(shù)學(xué)院 信息工程系,河南 濟(jì)源 459000)
近年來,手寫數(shù)字的識別是模式識別和人工智能領(lǐng)域的研究熱點,是一種利用計算機(jī)自動識別手寫數(shù)字的技術(shù).該技術(shù)被廣泛應(yīng)用到郵政編碼、財務(wù)報表、稅務(wù)系統(tǒng)數(shù)據(jù)統(tǒng)計、銀行票據(jù)等手寫數(shù)字自動識別錄入中[1-2].由于不同的手寫者字體不同,對大量的手寫數(shù)字實現(xiàn)完全正確識別不是一件容易的事情.隨著信息化技術(shù)的不斷發(fā)展,人們對自動識別的要求越來越高.因此,研究一種高效且準(zhǔn)確的手寫數(shù)字識別方法有著重要的意義[3-5].
目前常用的手寫數(shù)字識別方法有人工神經(jīng)網(wǎng)絡(luò)、K近鄰算法、支持向量機(jī)、貝葉斯算法等.這些方法對復(fù)雜分類問題的數(shù)學(xué)表示能力及網(wǎng)絡(luò)的泛化能力有限,往往不能達(dá)到高精度的要求,卷積神經(jīng)網(wǎng)絡(luò)的出現(xiàn)為解決這個問題提供了重要途徑[4-6].
傳統(tǒng)多層神經(jīng)網(wǎng)絡(luò)的基本組成包括輸入層、隱藏層和輸出層.卷積神經(jīng)網(wǎng)絡(luò)將傳統(tǒng)多層神經(jīng)網(wǎng)絡(luò)的隱藏層分為多個卷積層(Convolutional Layer)、池化層(Pooling Layer,也叫下采樣層)以及激活層,使得神經(jīng)網(wǎng)絡(luò)的層數(shù)加深.為了實現(xiàn)分類功能,還會設(shè)置一個全連接層(Fully Connected Layer, FC Layer)作為最后的輸出層,進(jìn)行損失計算并輸出分類結(jié)果[7].
圖像識別的卷積神經(jīng)網(wǎng)絡(luò)模型如圖1所示.最左邊是輸入圖像,以若干個數(shù)據(jù)矩陣的形式輸入;接著是卷積層,卷積層是卷積神經(jīng)網(wǎng)絡(luò)特有的,卷積層可以加上激活函數(shù);在卷積層后面是池化層,池化層沒有激活函數(shù).“卷積層+池化層”的組合結(jié)構(gòu)可以在隱含層出現(xiàn)很多次,這個次數(shù)根據(jù)模型的需要確定.網(wǎng)絡(luò)結(jié)構(gòu)中可以靈活地使用“卷積層+卷積層”組合,或者“卷積層+卷積層+池化層”組合,這些結(jié)構(gòu)在構(gòu)建模型時沒有限制.最常見的卷積神經(jīng)網(wǎng)絡(luò)都是若干“卷積層+池化層”的組合,在“卷積層+池化層”后面是全連接層.
圖1 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點是無需人工提取圖像特征.圖像經(jīng)過輸入層輸入卷積神經(jīng)網(wǎng)絡(luò)中,卷積層中的卷積核對輸入圖像進(jìn)行卷積運算,生成對應(yīng)的特征圖(Feature Map).下采樣層對上層卷積后生成的特征圖進(jìn)行局部特征提取,生成子采樣特征圖.使用多個卷積層和池化層提取圖像特征,可以有效避免人工特征提取的局限性和主觀性,使模型對旋轉(zhuǎn)、扭曲變形的圖像有較好的適應(yīng)性,在圖像識別之前省去預(yù)處理過程,可以簡化圖像識別的過程.卷積神經(jīng)網(wǎng)絡(luò)在圖像識別、自然語言處理等領(lǐng)域有廣泛的應(yīng)用[7].
卷積層由若干個卷積單元(Filter,也叫卷積核)組成,每個卷積單元的參數(shù)是在訓(xùn)練階段通過反向傳播算法優(yōu)化得到.當(dāng)卷積層的一個卷積核對輸入層的不同區(qū)域作卷積時,卷積核的權(quán)值不變,即一個卷積核只用來提取前一層網(wǎng)絡(luò)中不同位置的同一個特征[8],這樣不僅減少網(wǎng)絡(luò)參數(shù),而且可以使整個網(wǎng)絡(luò)獲得較好的魯棒性.通過卷積單元在圖像上平移并進(jìn)行卷積操作,使得圖像上每一個像素點的值與卷積核的乘積加入偏置,再經(jīng)過激活函數(shù)的運算,就可以得到輸入圖像的一個特征映射[9-10],卷積原理如公式(1)所示:
(1)
卷積層的卷積過程如圖2所示.假設(shè)輸入圖像的大小為5×5,卷積核大小為3×3,步長為1,經(jīng)過卷積運算后,得到大小為3×3的特征映射圖.
圖2 卷積運算示意圖
池化層也叫下采樣層.池化實際上是一種降采樣,主要是對前面卷積層提取出的特征圖進(jìn)行二次特征提取,通過去掉Feature Map中不重要的樣本,進(jìn)一步減少參數(shù)數(shù)量,從而達(dá)到減少運算量的目的,并且可以避免過擬合.池化層計算公式如公式(2)所示:
(2)
圖3 最大池化示意圖
卷積神經(jīng)網(wǎng)絡(luò)中,在最后一層卷積層與輸出層之間,加入全連接層.該層將卷積層最后的輸出轉(zhuǎn)化為一維數(shù)據(jù)序列,數(shù)據(jù)序列中的每個元素對應(yīng)一個神經(jīng)元,并與下一層的各個神經(jīng)元通過權(quán)值建立連接,其結(jié)構(gòu)如圖4所示.全連接層主要對特征進(jìn)行重新擬合,可以減少特征信息丟失,再使用Softmax函數(shù)進(jìn)行分類[14-15].
圖4 全連接結(jié)構(gòu)
根據(jù)以上分析,本文所設(shè)計的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖5所示.輸入Image代表輸入圖像,網(wǎng)絡(luò)主要包括兩個卷積大層,在每一個卷積大層分別有一個卷積層、一個激活層和一個池化層.為方便分類,在隱藏層和輸出層之間有一個全連接層,在兩個卷積大層中激活函數(shù)都選用ReLU,其計算公式如式(3).由于ReLU函數(shù)分段特性,相比其他激活函數(shù),計算速度大大增加,且該函數(shù)沒有指數(shù)運算,收斂速度比較快.
(3)
圖5 本文設(shè)計的網(wǎng)絡(luò)結(jié)構(gòu)
本實驗基于MNIST數(shù)據(jù)集進(jìn)行.該數(shù)據(jù)集包含0~9的很多圖片,分為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集兩部分.
conv1表示第一個卷積層,也是神經(jīng)網(wǎng)絡(luò)模型的輸入層.把輸入圖像(input_image)和卷積核(conv1_weights)進(jìn)行卷積運算,再加上偏置量(conv1_bias).在MNIST數(shù)據(jù)集中,每幅圖像均為黑白圖片,高度和寬度都是28像素,每幅圖像都是[1,784]的矩陣,因此需要使用reshape對圖片形狀進(jìn)行修改,修改為[-1,28,28,1]的四維向量.其中-1表示每次輸入的圖像數(shù)量,第2維、第3維的28分別表示圖像的高度和寬度,第4維的1表示圖像的通道數(shù),每幅圖像均為黑白圖像,因此通道數(shù)是1.conv1_weights是需要初始化的模型參數(shù),即網(wǎng)絡(luò)的權(quán)值,用變量存儲,因為第一層設(shè)計32個filter,每個filter大小為5*5,通道數(shù)是1,因此在初始化conv1_weights時指定其形狀為[5,5,1,32];卷積運算時步長為1;conv1_bias代表偏置,因為有32個filter,每個filter帶一個偏置,因此偏置的形狀為[32];第一卷積層的輸出結(jié)果conv1用ReLU函數(shù)激活.
input_image=tf.reshape(tensor=x,shape=[-1,28,28,1])
conv1_weights=tf.Variable(initial_value=tf.random_normal(shape=[5,5,1,32],stddev=0.01))
conv1_bias=tf.Variable(initial_value=tf.random_normal(shape=[32],stddev=0.01))
conv1=tf.nn.conv2d(input=input_image,filter=conv1_weights,strides=[1,1,1,1],padding="SAME")+conv1_bias
relu1 = tf.nn.relu(features=conv1)
pool1表示第一個池化層.relu1是上層激活層的輸出,作為第一池化層的輸入,形狀為[None,28,28,32],None代表輸入的圖像數(shù)量.池化層的窗口大小為2*2,步長為2,采用最大池化,經(jīng)過池化后輸出形狀為[None,14,14,32].
pool1 = tf.nn.max_pool(value=relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
conv2表示第二個卷積層,其輸入是上一池化層的輸出.該層設(shè)計64個卷積核,每個卷積核大小均為5*5,因此在初始化conv2_weights時指定其形狀為[5,5,32,64],步長為1,零填充padding=“SAME”.有64個filter,每個filter帶一個偏置,因此偏置的形狀為[64],輸入特征圖經(jīng)過conv2層卷積后,輸出圖像的形狀為[None,14,14,64].第二卷積層的輸出結(jié)果conv2用ReLU函數(shù)激活.
conv2_weights=tf.Variable(initial_value=tf.random_normal(shape=[5,5,32,64],stddev=0.01))
conv2_bias=tf.Variable(initial_value=tf.random_normal(shape=[64],stddev=0.01))
conv2=tf.nn.conv2d(input=pool1,filter=conv2_weights,strides=[1,1,1,1],padding="SAME")+conv2_bias
relu2=tf.nn.relu(features=conv2)
pool2表示第二個池化層.relu2是上層激活函數(shù)的輸出,作為第二池化層的輸入,形狀為[None,14,14,64],池化層的窗口大小為2*2,步長為2,采用最大池化,經(jīng)過池化后輸出形狀為[None,7,7,64].
pool2=tf.nn.max_pool(value=relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
fc表示全連接層.全連接層的輸入是2維數(shù)組,因此需要將上層的輸出轉(zhuǎn)換為2維數(shù)組,即矩陣[1,7*7*64];該模型輸出是10個數(shù)字的分類,因此輸出形狀為[1,10].
fc_x=tf.reshape(tensor=pool2,shape=[-1,7*7*64])
fc_ weights =create_weights(shape=[7*7*64,10])
fc_ bias =create_weights(shape=[10])
fc=tf.matmul(a= fc_x,b= fc_ weights)+ fc_ bias
本文使用Windows10操作系統(tǒng),計算機(jī)基本配置為Intel Core i5-9400處理器,主頻為2.9 GHz,4G DDR3內(nèi)存,使用的軟件平臺為Python3.6和TensorFlow1.8.0.
在神經(jīng)網(wǎng)絡(luò)實驗中,不同的優(yōu)化算法和學(xué)習(xí)率對實驗結(jié)果都會產(chǎn)生很大影響.目前對優(yōu)化算法的選擇還沒有達(dá)成共識,也暫無有效的算法來計算初始學(xué)習(xí)率.通常選擇不同的優(yōu)化算法,調(diào)整其學(xué)習(xí)率,通過結(jié)果對比,得出合適的模型參數(shù).針對本文模型,分別選用了GradientDescentOptimizer、MomentumOptimizer和Adam Optimizer 3種不同的優(yōu)化算法,測試其在不同學(xué)習(xí)率時的準(zhǔn)確率和損失,共訓(xùn)練1 000次,每訓(xùn)練10次收集一次準(zhǔn)確率和損失值,結(jié)果如表1所列.
表1 不同學(xué)習(xí)率下3種優(yōu)化算法對比
從以上實驗結(jié)果看出,在選用GradientDescentOptimize優(yōu)化算法時,當(dāng)學(xué)習(xí)率Learning rate=0.001時,模型無法收斂;用AdamOptimizer優(yōu)化算法時,當(dāng)學(xué)習(xí)率Learning rate為0.1和0.01時模型無法收斂;當(dāng)學(xué)習(xí)率Learning rate=0.001時,訓(xùn)練次數(shù)超過200次后,準(zhǔn)確率在99%以上,損失接近0.結(jié)果表明,本文所述模型在選用AdamOptimizer優(yōu)化算法,初始學(xué)習(xí)率為0.001時,該模型能夠達(dá)到較好的識別效果.
為驗證本模型的有效性,將本文模型和傳統(tǒng)的全連接網(wǎng)絡(luò)模型進(jìn)行對比,兩種模型在相同數(shù)據(jù)集上的準(zhǔn)確率和損失如表2所列.
表2 本文模型和全連接網(wǎng)絡(luò)模型對比
從表2中可以看出,本文所述網(wǎng)絡(luò)模型在訓(xùn)練次數(shù)到達(dá)190次時準(zhǔn)確率即可接近100%,損失降到0.05左右,而全連接網(wǎng)絡(luò)模型在訓(xùn)練到200次時準(zhǔn)確率才到達(dá)94%,損失降到0.4左右.因此本文所建立的網(wǎng)絡(luò)模型較傳統(tǒng)模型收斂速度更快.
以手寫數(shù)字自動識別為研究對象,解決了傳統(tǒng)多層全連接神經(jīng)網(wǎng)絡(luò)模型權(quán)值參數(shù)過多、計算量大的問題,文中設(shè)計了一種新的網(wǎng)絡(luò)模型,該網(wǎng)絡(luò)模型基于卷積神經(jīng)網(wǎng)絡(luò),包括兩個卷積層、兩個激活層、兩個池化層和一個全連接層;對比分析了幾種常用的優(yōu)化算法在選擇不同學(xué)習(xí)率時的識別效果,選用具有自適應(yīng)學(xué)習(xí)率的優(yōu)化算法.在MNIST數(shù)據(jù)集上進(jìn)行訓(xùn)練與測試,得到手寫數(shù)字自動識別模型.實驗結(jié)果表明,本文所構(gòu)建的手寫數(shù)字識別模型性能優(yōu)于傳統(tǒng)多層神經(jīng)網(wǎng)絡(luò)模型,識別準(zhǔn)確率高,有較好的魯棒性.