高春庚, 孫建國
(濟(jì)源職業(yè)技術(shù)學(xué)院 信息工程系, 河南 濟(jì)源 459000)
目前, 手寫數(shù)字的識別是人工智能領(lǐng)域研究的熱點, 其識別的方法有許多種, 如KNN(K近鄰)、 支持向量機(jī)和神經(jīng)網(wǎng)絡(luò)等. 在模式識別和人工智能領(lǐng)域, 神經(jīng)網(wǎng)絡(luò)的應(yīng)用非常廣泛. 將神經(jīng)網(wǎng)絡(luò)應(yīng)用于手寫數(shù)字識別, 有識別速度快、 分類能力強(qiáng)、 容錯性能和學(xué)習(xí)能力強(qiáng)等優(yōu)點[1]. 本文將神經(jīng)網(wǎng)絡(luò)應(yīng)用于手寫體數(shù)字識別中, 結(jié)合了TensorFlow技術(shù)搭建神經(jīng)網(wǎng)絡(luò)模型, 并利用該網(wǎng)絡(luò)模型進(jìn)行手寫數(shù)字的識別.
Google的TensorFlow是一種用于解決機(jī)器學(xué)習(xí)問題的有效的方法. 其是一個開源的軟件包, 該包的架構(gòu)靈活, 可以運行在多種平臺上[2]. 使用TensorFlow時, 主要采用計算圖的形式. 計算圖也叫數(shù)據(jù)流圖, 其是一種有向圖, 數(shù)學(xué)計算用節(jié)點和線來描述. 節(jié)點在數(shù)據(jù)流圖中代表數(shù)學(xué)操作, 也可以表示數(shù)據(jù)輸入的起點和輸出的終點. 圖中的線則表示節(jié)點間相互聯(lián)系的多維數(shù)據(jù)數(shù)組, 即張量. 其描述了計算之間的依賴關(guān)系. 當(dāng)輸入端準(zhǔn)備好張量數(shù)據(jù)后, 各種計算設(shè)備即可利用節(jié)點實現(xiàn)異步、 并行計算[3]. TensorFlow提供了搭建神經(jīng)網(wǎng)絡(luò)的接口, 利用這些接口可以方便地構(gòu)建各種模型的神經(jīng)網(wǎng)絡(luò), 從而可以簡化編程過程[1].
利用TensorFlow平臺通常需要以下步驟:(1)創(chuàng)建圖. 所有的任務(wù)在TensorFlow中都需要轉(zhuǎn)化為圖的形式才能計算. 圖包含了一組Operation代表的計算單元對象和Tensor代表的計算單元之間流動的數(shù)據(jù).(2)創(chuàng)建會話. 創(chuàng)建的圖要想傳入TensorFlow引擎, 需要為該圖創(chuàng)建一個會話.(3)啟動圖. 傳入TensorFlow引擎的圖需要啟動后, 才能執(zhí)行變量的初始化操作和其他操作.(4)結(jié)束會話[4].
人工神經(jīng)網(wǎng)絡(luò)(artificial neural network)是模仿自然界中動物大腦的結(jié)構(gòu)和功能的一種計算模型. 該模型由許多神經(jīng)元按照不同的層次組織起來, 按照從輸入層到輸出層進(jìn)行前向運算, 前一層的輸出加權(quán)求和后, 作為下一層的輸入. 需要計算的數(shù)據(jù)通過輸入層輸入神經(jīng)網(wǎng)絡(luò), 經(jīng)過模型計算后的預(yù)測結(jié)果經(jīng)過輸出層進(jìn)行輸出. 然后把輸出層輸出的結(jié)果和真實的值對比, 并將誤差反向傳播, 之后不斷調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重, 最終使網(wǎng)絡(luò)的誤差達(dá)到最小. 經(jīng)典的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)包含三個層次, 分別為輸入層、 輸出層和隱藏層. 如圖1所示.
圖1 神經(jīng)網(wǎng)絡(luò)模型圖
網(wǎng)絡(luò)中每層的圓圈代表一個神經(jīng)元. 隱藏層和輸出層的神經(jīng)元由輸入的數(shù)據(jù)計算后輸出, 輸入層的神經(jīng)元只是輸入. 神經(jīng)網(wǎng)絡(luò)中每個連接都有一個權(quán)值, 同一層神經(jīng)元之間沒有連接.
神經(jīng)網(wǎng)絡(luò)的主要用途在于分類. 利用神經(jīng)網(wǎng)絡(luò)處理多分類問題時, 假如有n個類別, 通常神經(jīng)網(wǎng)絡(luò)的輸出節(jié)點也設(shè)置為n個.
Softmax回歸模型是一種解決多分類問題的模型, 是從解決二分類問題的logistic模型演變而來. 假設(shè)數(shù)據(jù)集由{(x1,y1), (x2,y2), …(xn,yn)}共n個樣本組成, 其中xi為輸入特征,yi為目標(biāo)值. 在多分類問題中,yi的取值有多個組成.Softmax回歸模型將神經(jīng)網(wǎng)絡(luò)輸出結(jié)果yi轉(zhuǎn)換成概率結(jié)果. 如圖2所示:
圖2 Softmax回歸模型圖
假設(shè)神經(jīng)網(wǎng)絡(luò)的權(quán)重為wi,j, 則圖2用矩陣的形式描述為[4]:
(1)
當(dāng)數(shù)據(jù)通過輸入層輸入神經(jīng)網(wǎng)絡(luò)后, 通過公式(1)計算, 預(yù)測出各個樣本屬于某個類別的概率值, 并根據(jù)概率值大小對樣本進(jìn)行分類.
本實驗采用MNIST數(shù)據(jù)集. 該數(shù)據(jù)集包含很多圖片, 其被分成了訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集兩部分. 其中訓(xùn)練數(shù)據(jù)集(mnist.train)共包括55 000行數(shù)據(jù), 測試數(shù)據(jù)集(mnist.test)共包括10 000行數(shù)據(jù). MNIST數(shù)據(jù)集中的每個樣本都包含兩部分:第一部分是一張圖片, 該圖片包含手寫數(shù)字;另一部分是該數(shù)字對應(yīng)的標(biāo)簽. 每張圖片都是黑白圖片, 為28×28像素[5]. 如果將該數(shù)組以向量的形式展開, 其長度則是28×28=784. 每個樣本都具有相應(yīng)的標(biāo)簽, 用one-hot編碼表示樣本圖像中繪制的數(shù)字. 例如[0,0,0,0,0,0,1,0,0,0]表示數(shù)字8[6].
神經(jīng)網(wǎng)絡(luò)輸入層. 由于輸入的圖片共28*28=784像素, 而且是黑白圖片, 通道數(shù)是1, 所以每個樣本一維化后輸入的特征值共784個, 一張圖片輸入時輸入層需要784個神經(jīng)元.
x=tf.placeholder(dtype=tf.float32,shape=(No,784)). 代碼中No代表輸入圖片的張數(shù).
神經(jīng)網(wǎng)絡(luò)的輸出層是Softmax回歸模型, 因為目標(biāo)值0~9共10個數(shù)值, 所以輸出層用一個1*10維張量來表示10個類別.
y_true=tf.placeholder(dtype=tf.float32,shape=(No,10)). 這里的No與神經(jīng)網(wǎng)絡(luò)的輸入對應(yīng), 也代表輸入圖片的張數(shù).
因為輸入的圖片共784個特征, 目標(biāo)值共10個類別, 即目標(biāo)值共10列, 所以神經(jīng)網(wǎng)絡(luò)的權(quán)重值w(用矩陣表示)的形狀為784*10. 進(jìn)行加權(quán)求和時, 加上偏置量, 最后通過Softmax映射, 以實現(xiàn)對數(shù)字的分類.
Weights=tf.Variable(initial_value=tf.random_normal(shape=[784,10]))
bias=tf.Variable(initial_value=tf.random_normal(shape=[10]))
訓(xùn)練階段. 損失函數(shù)用交叉熵?fù)p失和Softmax結(jié)合, 用梯度下降法優(yōu)化損失.
在人工神經(jīng)網(wǎng)絡(luò)訓(xùn)練的過程中, 迭代次數(shù)和學(xué)習(xí)率對結(jié)果有很大的影響. 目前還沒有有效的方法設(shè)置迭代次數(shù)和學(xué)習(xí)率, 一般是通過多次實驗來調(diào)整學(xué)習(xí)率和迭代次數(shù), 從而得出模型參數(shù).
當(dāng)學(xué)習(xí)率設(shè)為0.05時, 損失隨著訓(xùn)練次數(shù)的增加不斷減小, 訓(xùn)練次數(shù)接近300次時, 損失降到1.2左右, 準(zhǔn)確率到達(dá)80%, 如圖3、 圖4所示; 當(dāng)學(xué)習(xí)率為0.1時, 隨著訓(xùn)練次數(shù)的增加, 損失越來越小, 訓(xùn)練次數(shù)接近280次時, 損失降到0.19左右, 準(zhǔn)確率達(dá)到99%, 如圖5、 圖6所示. 因此學(xué)習(xí)率設(shè)置為0.1, 迭代次數(shù)為280時, 準(zhǔn)確率已收斂, 無需再進(jìn)行更多次數(shù)的訓(xùn)練.
圖3 學(xué)習(xí)率為0.05時損失率變化曲線
圖4 學(xué)習(xí)率為0.05時損失和準(zhǔn)確率
圖5 學(xué)習(xí)率為0.1時損失率變化曲線
圖6 學(xué)習(xí)率為0.1時損失和準(zhǔn)確率
本文介紹了一款基于TensorFlow的手寫體數(shù)字識別的設(shè)計與實現(xiàn)過程. 其基于人工神經(jīng)網(wǎng)絡(luò)原理, 用TensorFlow搭建神經(jīng)網(wǎng)絡(luò)并進(jìn)行訓(xùn)練, 并用MNIST數(shù)據(jù)集進(jìn)行實驗, 識別較為準(zhǔn)確. 當(dāng)然, 本方法還有待改進(jìn)的地方, 由于實驗所使用的計算機(jī)性能有限, 本文只設(shè)計了3層神經(jīng)網(wǎng)絡(luò), 下一步研究將增加網(wǎng)絡(luò)層數(shù)、 用更好的算法優(yōu)化以減少損失等.