張新勇 甘恒 李昌夏 加文浩
摘要:基于卷積神經(jīng)網(wǎng)絡(luò)在手寫數(shù)字識(shí)別上的應(yīng)用,對(duì)卷積神經(jīng)網(wǎng)絡(luò)模型進(jìn)行介紹。本實(shí)驗(yàn)使用python編程語言在Keras上搭建模型,并對(duì)模型進(jìn)行訓(xùn)練。實(shí)驗(yàn)數(shù)據(jù)集為MNIST。模型訓(xùn)練完畢后,對(duì)準(zhǔn)確率進(jìn)行評(píng)估。最后對(duì)測試數(shù)據(jù)進(jìn)行預(yù)測以及利用混淆矩陣對(duì)哪些數(shù)字準(zhǔn)確率較高和哪些數(shù)字容易混淆進(jìn)行評(píng)估。
關(guān)鍵詞:人工智能;手寫數(shù)字識(shí)別;卷積神經(jīng)網(wǎng)絡(luò);Keras
Abstract: Based on the application of convolutional neural network in handwritten digit recognition, the model of convolutional neural network is introduced. In this experiment, Python programming language is used to build the model on Keras, and the model is trained. The experimental data set was MNIST. After the training of the model, the accuracy was evaluated. Finally, the test data are predicted and the confusion matrix is used to evaluate which numbers are more accurate and which numbers are easy to be confused.
Key words: AI; handwritten digit recognition; CNN; Keras
由于手寫數(shù)字在日常生活中的大量運(yùn)用,利用計(jì)算機(jī)進(jìn)行手寫數(shù)字的自動(dòng)識(shí)別成了研究熱點(diǎn)。手寫數(shù)字根據(jù)每個(gè)人的習(xí)慣會(huì)千差萬別,所以依靠線性模型不能進(jìn)行準(zhǔn)確的識(shí)別[1]。過去人們也提出了基于反向傳播神經(jīng)網(wǎng)絡(luò)的數(shù)字識(shí)別方法、類中心歐式距離、貝葉斯分類算法[2]等來進(jìn)行手寫數(shù)字識(shí)別,但效果都不盡人意。本文利用基于深度學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò)來處理手寫數(shù)字識(shí)別問題,相比以往基于機(jī)器學(xué)習(xí)的算法,它有以下優(yōu)點(diǎn):(1)特征提取高效:不需要提前設(shè)計(jì)好特征的內(nèi)容和數(shù)量,卷積神經(jīng)網(wǎng)絡(luò)可以自己訓(xùn)練,自我修正,來得到好的效果;(2)數(shù)據(jù)格式的簡易性:對(duì)數(shù)據(jù)格式不需要過多處理;(3)參數(shù)數(shù)目比較少:只需要初始化給每個(gè)神經(jīng)元隨機(jī)賦予一個(gè)權(quán)重和偏置項(xiàng),隨后模型會(huì)自己修正參數(shù),使其達(dá)到最優(yōu)。綜上,卷積神經(jīng)網(wǎng)絡(luò)不僅克服了傳統(tǒng)方法預(yù)處理時(shí)的弊端,還提高預(yù)測的準(zhǔn)確率。
1卷積神經(jīng)網(wǎng)絡(luò)簡介
卷積神經(jīng)網(wǎng)絡(luò)簡稱CNN,其核心概念主要是稀疏連接、共享權(quán)值和池化。稀疏連接主要是通過對(duì)數(shù)據(jù)的局部區(qū)域進(jìn)行建模,以發(fā)現(xiàn)局部的一些特性。共享權(quán)值可以使需要優(yōu)化的參數(shù)變少。子采樣解決了圖像的平移不變性。這些特點(diǎn)也降低了網(wǎng)絡(luò)模型過擬合的程度。卷積神經(jīng)網(wǎng)絡(luò)主要有卷積層、下采樣層和全連接層。卷積神經(jīng)網(wǎng)絡(luò)利用卷積層和下采樣層交替疊加,得到特征的高層抽象,然后對(duì)高層抽象的特征進(jìn)行全連接的映射,最終實(shí)現(xiàn)分類。
2相關(guān)技術(shù)
2.1 Keras框架
Keras是TensorFlow官方的高層API[3]。Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,并對(duì)TensorFlow等有較好的優(yōu)化。Keras支持Python、R等多種語言。同Keras相比,Tensorflow更注重各種深度學(xué)習(xí)模型的細(xì)節(jié),但是會(huì)有更大的代碼量,耗費(fèi)更多的時(shí)間進(jìn)行開發(fā)。
2.2卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)是對(duì)多層網(wǎng)絡(luò)模型的一個(gè)改進(jìn),由多個(gè)卷積層和池化層交替連接而成[4]。在CNN中,充分利用圖像數(shù)據(jù)局部相關(guān)性的特點(diǎn),盡可能減少網(wǎng)絡(luò)中參數(shù)個(gè)數(shù),方便對(duì)其求解。
2.2.1卷積運(yùn)算
卷積層的意義是利用卷積核對(duì)原圖像進(jìn)行處理,處理后的圖像保留原圖像的一些特征。當(dāng)用不同的卷積核處理時(shí),處理后的多個(gè)圖像就會(huì)對(duì)原圖像不同地方的特征進(jìn)行反映。卷積運(yùn)算的運(yùn)算方式:(1)以隨機(jī)的方式產(chǎn)生filter weight大小是3×3;(2)對(duì)原始圖片從左至右,從上至下依次選取3×3的矩陣;(3)圖像選取的3×3矩陣與filter weight3×3矩陣相乘。
以上面的方式就可以完成所有圖像的處理。卷積運(yùn)算不會(huì)改變圖像的大小。卷積運(yùn)算后的效果很類似于濾鏡效果,可以幫助我們提取輸入的不同特征,例如邊緣、線條和角等。
2.2.2池化運(yùn)算
池化運(yùn)算可以對(duì)圖像進(jìn)行縮減取樣[5],池化采樣不會(huì)改變圖像的數(shù)量,但會(huì)改變圖像的大小。上圖所示,就是用局部特征的最大值來表達(dá)此區(qū)域的特征??s小了圖像的大小,減少了數(shù)據(jù)量。這在一定程度上也控制了過擬合[6]。
3卷積神經(jīng)網(wǎng)絡(luò)的手寫數(shù)字識(shí)別實(shí)驗(yàn)
3.1數(shù)據(jù)源與處理
本實(shí)驗(yàn)采用MNIST數(shù)據(jù)集作為實(shí)驗(yàn)數(shù)據(jù)。MNIST數(shù)據(jù)集共有訓(xùn)練數(shù)據(jù)60000項(xiàng),測試數(shù)據(jù)10000項(xiàng)。每一項(xiàng)都由images(單色數(shù)字圖像)和labels(真實(shí)數(shù)字)所組成。數(shù)據(jù)圖像預(yù)處理分為以下兩個(gè)步驟:圖像是28×28的二維圖像,利用reshape函數(shù)將圖像轉(zhuǎn)化為長度為784的一維向量,并且轉(zhuǎn)換為Float類型;將數(shù)字值進(jìn)行歸一化:圖像每個(gè)像素點(diǎn)灰度的深淺都是用0至255的數(shù)字值來表示。用255除每個(gè)值,使其轉(zhuǎn)化為0到1之間的值,便于后續(xù)的計(jì)算。label數(shù)據(jù)處理:label標(biāo)簽段處理之前為0-9的數(shù)字,以O(shè)ne-Hot Encoding(一位有效編碼)轉(zhuǎn)換為10個(gè)0或1的組合,正好對(duì)應(yīng)輸出層10個(gè)神經(jīng)元。
3.2實(shí)驗(yàn)過程
數(shù)據(jù)預(yù)處理會(huì)產(chǎn)生Features(數(shù)字圖像特征值)與Label(數(shù)字真實(shí)的值),接著會(huì)建立卷積神經(jīng)網(wǎng)絡(luò)模型。輸入訓(xùn)練數(shù)據(jù)與Label,執(zhí)行10個(gè)訓(xùn)練周期來對(duì)模型進(jìn)行訓(xùn)練,并使用測試數(shù)據(jù)評(píng)估模型準(zhǔn)確率。使用已完成的模型,輸入測試數(shù)據(jù)進(jìn)行預(yù)測。