高春庚,孫建國
(濟源職業技術學院 信息工程系,河南 濟源 459000)
近年來,手寫數字的識別是模式識別和人工智能領域的研究熱點,是一種利用計算機自動識別手寫數字的技術.該技術被廣泛應用到郵政編碼、財務報表、稅務系統數據統計、銀行票據等手寫數字自動識別錄入中[1-2].由于不同的手寫者字體不同,對大量的手寫數字實現完全正確識別不是一件容易的事情.隨著信息化技術的不斷發展,人們對自動識別的要求越來越高.因此,研究一種高效且準確的手寫數字識別方法有著重要的意義[3-5].
目前常用的手寫數字識別方法有人工神經網絡、K近鄰算法、支持向量機、貝葉斯算法等.這些方法對復雜分類問題的數學表示能力及網絡的泛化能力有限,往往不能達到高精度的要求,卷積神經網絡的出現為解決這個問題提供了重要途徑[4-6].
傳統多層神經網絡的基本組成包括輸入層、隱藏層和輸出層.卷積神經網絡將傳統多層神經網絡的隱藏層分為多個卷積層(Convolutional Layer)、池化層(Pooling Layer,也叫下采樣層)以及激活層,使得神經網絡的層數加深.為了實現分類功能,還會設置一個全連接層(Fully Connected Layer, FC Layer)作為最后的輸出層,進行損失計算并輸出分類結果[7].
圖像識別的卷積神經網絡模型如圖1所示.最左邊是輸入圖像,以若干個數據矩陣的形式輸入;接著是卷積層,卷積層是卷積神經網絡特有的,卷積層可以加上激活函數;在卷積層后面是池化層,池化層沒有激活函數.“卷積層+池化層”的組合結構可以在隱含層出現很多次,這個次數根據模型的需要確定.網絡結構中可以靈活地使用“卷積層+卷積層”組合,或者“卷積層+卷積層+池化層”組合,這些結構在構建模型時沒有限制.最常見的卷積神經網絡都是若干“卷積層+池化層”的組合,在“卷積層+池化層”后面是全連接層.

圖1 卷積神經網絡結構圖
卷積神經網絡的優點是無需人工提取圖像特征.圖像經過輸入層輸入卷積神經網絡中,卷積層中的卷積核對輸入圖像進行卷積運算,生成對應的特征圖(Feature Map).下采樣層對上層卷積后生成的特征圖進行局部特征提取,生成子采樣特征圖.使用多個卷積層和池化層提取圖像特征,可以有效避免人工特征提取的局限性和主觀性,使模型對旋轉、扭曲變形的圖像有較好的適應性,在圖像識別之前省去預處理過程,可以簡化圖像識別的過程.卷積神經網絡在圖像識別、自然語言處理等領域有廣泛的應用[7].
卷積層由若干個卷積單元(Filter,也叫卷積核)組成,每個卷積單元的參數是在訓練階段通過反向傳播算法優化得到.當卷積層的一個卷積核對輸入層的不同區域作卷積時,卷積核的權值不變,即一個卷積核只用來提取前一層網絡中不同位置的同一個特征[8],這樣不僅減少網絡參數,而且可以使整個網絡獲得較好的魯棒性.通過卷積單元在圖像上平移并進行卷積操作,使得圖像上每一個像素點的值與卷積核的乘積加入偏置,再經過激活函數的運算,就可以得到輸入圖像的一個特征映射[9-10],卷積原理如公式(1)所示:
(1)

卷積層的卷積過程如圖2所示.假設輸入圖像的大小為5×5,卷積核大小為3×3,步長為1,經過卷積運算后,得到大小為3×3的特征映射圖.

圖2 卷積運算示意圖
池化層也叫下采樣層.池化實際上是一種降采樣,主要是對前面卷積層提取出的特征圖進行二次特征提取,通過去掉Feature Map中不重要的樣本,進一步減少參數數量,從而達到減少運算量的目的,并且可以避免過擬合.池化層計算公式如公式(2)所示:
(2)


圖3 最大池化示意圖
卷積神經網絡中,在最后一層卷積層與輸出層之間,加入全連接層.該層將卷積層最后的輸出轉化為一維數據序列,數據序列中的每個元素對應一個神經元,并與下一層的各個神經元通過權值建立連接,其結構如圖4所示.全連接層主要對特征進行重新擬合,可以減少特征信息丟失,再使用Softmax函數進行分類[14-15].

圖4 全連接結構
根據以上分析,本文所設計的卷積神經網絡結構如圖5所示.輸入Image代表輸入圖像,網絡主要包括兩個卷積大層,在每一個卷積大層分別有一個卷積層、一個激活層和一個池化層.為方便分類,在隱藏層和輸出層之間有一個全連接層,在兩個卷積大層中激活函數都選用ReLU,其計算公式如式(3).由于ReLU函數分段特性,相比其他激活函數,計算速度大大增加,且該函數沒有指數運算,收斂速度比較快.

(3)

圖5 本文設計的網絡結構
本實驗基于MNIST數據集進行.該數據集包含0~9的很多圖片,分為訓練數據集和測試數據集兩部分.
conv1表示第一個卷積層,也是神經網絡模型的輸入層.把輸入圖像(input_image)和卷積核(conv1_weights)進行卷積運算,再加上偏置量(conv1_bias).在MNIST數據集中,每幅圖像均為黑白圖片,高度和寬度都是28像素,每幅圖像都是[1,784]的矩陣,因此需要使用reshape對圖片形狀進行修改,修改為[-1,28,28,1]的四維向量.其中-1表示每次輸入的圖像數量,第2維、第3維的28分別表示圖像的高度和寬度,第4維的1表示圖像的通道數,每幅圖像均為黑白圖像,因此通道數是1.conv1_weights是需要初始化的模型參數,即網絡的權值,用變量存儲,因為第一層設計32個filter,每個filter大小為5*5,通道數是1,因此在初始化conv1_weights時指定其形狀為[5,5,1,32];卷積運算時步長為1;conv1_bias代表偏置,因為有32個filter,每個filter帶一個偏置,因此偏置的形狀為[32];第一卷積層的輸出結果conv1用ReLU函數激活.
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代表輸入的圖像數量.池化層的窗口大小為2*2,步長為2,采用最大池化,經過池化后輸出形狀為[None,14,14,32].
pool1 = tf.nn.max_pool(value=relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
conv2表示第二個卷積層,其輸入是上一池化層的輸出.該層設計64個卷積核,每個卷積核大小均為5*5,因此在初始化conv2_weights時指定其形狀為[5,5,32,64],步長為1,零填充padding=“SAME”.有64個filter,每個filter帶一個偏置,因此偏置的形狀為[64],輸入特征圖經過conv2層卷積后,輸出圖像的形狀為[None,14,14,64].第二卷積層的輸出結果conv2用ReLU函數激活.
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是上層激活函數的輸出,作為第二池化層的輸入,形狀為[None,14,14,64],池化層的窗口大小為2*2,步長為2,采用最大池化,經過池化后輸出形狀為[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維數組,因此需要將上層的輸出轉換為2維數組,即矩陣[1,7*7*64];該模型輸出是10個數字的分類,因此輸出形狀為[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操作系統,計算機基本配置為Intel Core i5-9400處理器,主頻為2.9 GHz,4G DDR3內存,使用的軟件平臺為Python3.6和TensorFlow1.8.0.
在神經網絡實驗中,不同的優化算法和學習率對實驗結果都會產生很大影響.目前對優化算法的選擇還沒有達成共識,也暫無有效的算法來計算初始學習率.通常選擇不同的優化算法,調整其學習率,通過結果對比,得出合適的模型參數.針對本文模型,分別選用了GradientDescentOptimizer、MomentumOptimizer和Adam Optimizer 3種不同的優化算法,測試其在不同學習率時的準確率和損失,共訓練1 000次,每訓練10次收集一次準確率和損失值,結果如表1所列.

表1 不同學習率下3種優化算法對比
從以上實驗結果看出,在選用GradientDescentOptimize優化算法時,當學習率Learning rate=0.001時,模型無法收斂;用AdamOptimizer優化算法時,當學習率Learning rate為0.1和0.01時模型無法收斂;當學習率Learning rate=0.001時,訓練次數超過200次后,準確率在99%以上,損失接近0.結果表明,本文所述模型在選用AdamOptimizer優化算法,初始學習率為0.001時,該模型能夠達到較好的識別效果.
為驗證本模型的有效性,將本文模型和傳統的全連接網絡模型進行對比,兩種模型在相同數據集上的準確率和損失如表2所列.

表2 本文模型和全連接網絡模型對比
從表2中可以看出,本文所述網絡模型在訓練次數到達190次時準確率即可接近100%,損失降到0.05左右,而全連接網絡模型在訓練到200次時準確率才到達94%,損失降到0.4左右.因此本文所建立的網絡模型較傳統模型收斂速度更快.
以手寫數字自動識別為研究對象,解決了傳統多層全連接神經網絡模型權值參數過多、計算量大的問題,文中設計了一種新的網絡模型,該網絡模型基于卷積神經網絡,包括兩個卷積層、兩個激活層、兩個池化層和一個全連接層;對比分析了幾種常用的優化算法在選擇不同學習率時的識別效果,選用具有自適應學習率的優化算法.在MNIST數據集上進行訓練與測試,得到手寫數字自動識別模型.實驗結果表明,本文所構建的手寫數字識別模型性能優于傳統多層神經網絡模型,識別準確率高,有較好的魯棒性.