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