肖璞,黃海霞
(三江學(xué)院計算機(jī)科學(xué)與工程學(xué)院,南京210012)
隨著谷歌AlphaGo 的成功問世,人工智能吸引了大眾媒體的目光。之后關(guān)于人工智能的名詞接踵而來,如機(jī)器學(xué)習(xí)和深度學(xué)習(xí)[1]等。如果說人工智能是目標(biāo),那么機(jī)器學(xué)習(xí)和深度學(xué)習(xí)就是手段。深度學(xué)習(xí)的產(chǎn)生可以說是受到了生物大腦的影響,但不能簡單的把深度學(xué)習(xí)的研究歸結(jié)于是去模擬大腦工作。深度學(xué)習(xí)的研究很多與應(yīng)用與數(shù)學(xué)基礎(chǔ)有關(guān)[2]。卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)[3]是深度學(xué)習(xí)的一種架構(gòu),主要有輸入層、卷積層、池化層和輸出層,帶有這種卷積結(jié)構(gòu)的深度神經(jīng)網(wǎng)絡(luò)也被大量應(yīng)用于機(jī)器學(xué)習(xí)之中。雖然傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)也能識別手寫數(shù)字,但是基于CNN 模型的算法[4]更加通用。卷積神經(jīng)網(wǎng)絡(luò)可以像人類一樣直接讀取二維圖像,結(jié)構(gòu)上也更類似于人類的視覺神經(jīng)系統(tǒng),因而具有強(qiáng)大的特征提取能力[5]。之前一般都是采用人工來進(jìn)行對數(shù)據(jù)的訓(xùn)練,這需要用到大量的人力進(jìn)行特征提取,現(xiàn)在我們可以自動進(jìn)行大批量數(shù)據(jù)的訓(xùn)練。
CNN 的基本原理和基礎(chǔ)被視為機(jī)器學(xué)習(xí)的首選解決方案?;贑NN 算法的深度神經(jīng)網(wǎng)絡(luò)相對于其他一些學(xué)習(xí)技術(shù)以及設(shè)計出的特征提取計算有著明顯的優(yōu)越性。本文以CNN 模型為深度判別模型,在傳統(tǒng)CNN 算法基礎(chǔ)上研究了LeNet-5 網(wǎng)絡(luò)結(jié)構(gòu),以及谷歌的Inception-v3 網(wǎng)絡(luò)結(jié)構(gòu)。這兩種網(wǎng)絡(luò)結(jié)構(gòu)在手寫數(shù)字識別和圖像識別中都取得了非常好的效果。并且CNN 算法在文本分類上也有著不錯的成果。本文在TensorFlow 框架下通過CNN 算法與回歸模型的對比,識別MNIST 手寫體,驗證了CNN 算法的優(yōu)越性,也驗證了CNN 算法在圖像識別、車牌識別和文本分類上的可行性。
神經(jīng)網(wǎng)絡(luò)是人們把神經(jīng)網(wǎng)絡(luò)和大腦及生物學(xué)上的其他種類做了大量的類比。這里可以將它看做是與大腦無關(guān)的一組由簡單函數(shù)所組成的一組函數(shù),通過多階段的分層計算形成更為復(fù)雜的非線性函數(shù)??梢远逊e更多層來得到任意深度的神經(jīng)網(wǎng)絡(luò),如線性評分函數(shù)、兩層神經(jīng)網(wǎng)絡(luò)函數(shù)、三層深度神經(jīng)網(wǎng)絡(luò)函數(shù)等。其中三層深度神經(jīng)網(wǎng)絡(luò)函數(shù)的公式如下:
神經(jīng)傳導(dǎo)的原理可以用計算機(jī)來進(jìn)行仿真,每個計算節(jié)點(diǎn)方法都是類似的。計算機(jī)圖里節(jié)點(diǎn)的相互連接,我們需要輸入或者是把信號x 傳入神經(jīng)元。所有x輸入量,例如x0、x1、x2 等,采用如賦予權(quán)重w 的方法疊加匯合到一起。這樣就是做了某種類型的運(yùn)算。就像w 乘以x 加上b,再把所有結(jié)果整合起來,這就得到了激活函數(shù)。我們將激活函數(shù)應(yīng)用在神經(jīng)元的端部,所得到的值作為輸出。最后將該值傳輸?shù)脚c之相關(guān)聯(lián)的神經(jīng)元。
激活函數(shù)基本上接收了所有輸入,然后再輸出一個值。Sigmoid 激活函數(shù)以及其他的一些非線性函數(shù),而這些非線性函數(shù)可以類比神經(jīng)元的觸發(fā)或者說是神經(jīng)元的放電率。神經(jīng)元通過采用離散尖峰將信號傳遞至相鄰神經(jīng)元。如果觸發(fā)非常迅速,就會產(chǎn)生強(qiáng)信號。經(jīng)過激活函數(shù)計算得到的值在某種意義上講是放電率。
以一個矩陣運(yùn)算公式模擬輸出與接收神經(jīng)元的工作方式,公式如下:
輸入3 個神經(jīng)元:x1、x2、x3,模擬接收神經(jīng)元之后會輸出兩個神經(jīng)元:y1 和y2,需要6 個軸突來完全連接輸入和接收神經(jīng)元。最后使用激活函數(shù),得到的值傳入下個神經(jīng)元。
近年來,由于深度學(xué)習(xí)的成功,多層感知器模型作為一種比較受歡迎機(jī)器學(xué)習(xí)解決方案又重新受到了重視。多層感知器模型可分為三個層:輸入層、隱藏層和輸出層。若輸入748 個神經(jīng)元,即是一張28×28 像素的數(shù)字為7 的二維圖像,那么這748 個神經(jīng)元就會接收外界的傳送信號。然后隱藏層模擬內(nèi)部神經(jīng)元,共有256 個隱藏神經(jīng)元。軸突連接輸入層和隱藏層。建立輸入層與隱藏層的公式為:
軸突連接隱藏層和輸入層。建立的隱藏層和輸入層公式為:
最后輸出層輸出10 個神經(jīng)元,可以使用Softmax損失函數(shù)來進(jìn)行概率分布,然后把數(shù)字7 預(yù)測出來。
現(xiàn)代化的CNN 算法可以充分利用大量數(shù)據(jù)來獲得網(wǎng)絡(luò)圖像和ImageNet 數(shù)據(jù)集來進(jìn)行訓(xùn)練并測試,最后提高識別率。
把一張長和寬都是5 像素的圖片用一個長和寬都是3 像素的卷積核進(jìn)行采樣,往縱向移動,卷積核不變,移動的步長為1。采樣完后得到一張長和寬都是3像素的特征圖。
卷積運(yùn)算操作就是使用兩個大小不同的矩陣進(jìn)行的一種數(shù)學(xué)運(yùn)算。卷積運(yùn)算公式表示為:
把卷積核w 展開得到一個一維向量,排列一下使它能夠進(jìn)行點(diǎn)積。遍歷所有的通道,使卷積核緊挨著圖片的一個空間位置,然后將所有對應(yīng)的元素分別相乘。
如果對一張圖片進(jìn)行CNN 算法處理需要四個步驟:
(1)圖像輸入:獲取所輸入的數(shù)據(jù)圖像。
(2)卷積運(yùn)算:用于搜索特定模式,對圖像特征進(jìn)行提取。
(3)池化操作:用來在特征提取過程中降低采樣率。
(4)全連接層:用于對圖像進(jìn)行分類。
MNSIT 是一個手寫數(shù)字?jǐn)?shù)據(jù)庫,有60000 個訓(xùn)練的樣本集和10000 個測試的樣本集。數(shù)據(jù)集的標(biāo)簽就是0 到9。在MNIST 圖片集中,所有的圖片長和寬都為28 像素。
要完成預(yù)測分類首先要對數(shù)據(jù)庫進(jìn)行獲取,然后輸入數(shù)據(jù)。MNIST 數(shù)據(jù)可以使用input_data 函數(shù)讀取相關(guān)的數(shù)據(jù)集。接下來對數(shù)據(jù)進(jìn)行讀取,就是用圖片的索引對圖片進(jìn)行提取,然后對圖片進(jìn)行特征標(biāo)注[6]。
Softmax 回歸模型是一種將信號轉(zhuǎn)換為概率的損失函數(shù)。針對類別去計算概率分布的訓(xùn)練公式如下:
采用先求出輸入值與權(quán)值的乘積和,再添加一個偏置項的方式。偏置項不與訓(xùn)練的數(shù)據(jù)進(jìn)行交互,而是給出數(shù)據(jù)獨(dú)立的偏好值。當(dāng)數(shù)據(jù)不平衡的時候,偏差值會增加,相當(dāng)于增加了噪音。然后所求得的值將會轉(zhuǎn)換成概率。
Softmax 也是模型函數(shù)定義的一種形式。數(shù)學(xué)公式如下:
我們將其指數(shù)化以便結(jié)果都是正數(shù),再把結(jié)果值歸一化處理。當(dāng)經(jīng)過Softmax 函數(shù)處理值后會得到概率分布,然后所有的對象就會有分配到相應(yīng)的概率。每個概率值都在0 和1 之間,所有的概率和為1。Softmax 計算公式為:
對于模型編寫可以按上述公式進(jìn)行。在模型訓(xùn)練中,可以使用梯度下降法對權(quán)重進(jìn)行更新,并啟動模型訓(xùn)練。通過21 次循環(huán)訓(xùn)練,模型最終結(jié)果是0.9139。如圖1 所示。
圖1 回歸模型訓(xùn)練結(jié)果圖
現(xiàn)在通過使用卷積神經(jīng)網(wǎng)絡(luò)重新對MNIST 數(shù)據(jù)集進(jìn)行驗證,我們將采用全新的CNN 算法來處理數(shù)據(jù)。
首先定義一個函數(shù),函數(shù)的作用是進(jìn)行初始化權(quán)值,生成一個截斷的正態(tài)分布。之后在卷積層使用TensorFlow 中的一個庫來進(jìn)行二維的卷積操作。卷積層的代碼如下所示。
def conv2d(x,w):
return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')
這里的x 是指4 維的值,w 是濾波器,strides[1]表示x 方向上的步長,strides[2]表示y 方向上的步長。
在池化層,用的最大池化的方式,取所劃分區(qū)域里最大的值。在第一個卷積層中對權(quán)值和偏置值進(jìn)行初始化操作。定義的采樣窗口是5×5,采樣完后得到32個卷積核,也就是32 個特征平面。這里32 個卷積核用到了32 個偏置值。
之后進(jìn)行ReLu 激活函數(shù)操作。把第一個卷積之后得到的結(jié)果傳入pooling 層。然后定義第二個卷積層,輸出64 個卷積核,也就是64 個特征平面。接下來定義第一個全連接層。第一個全連接層輸出后,得出神經(jīng)元的輸出概率,然后對定義第二個全連接層。之后可以使用交叉熵代價函數(shù)和一些其他的優(yōu)化方式。然后可以啟動模型訓(xùn)練。
通過21 次的循環(huán)訓(xùn)練可以看到,模型最終的結(jié)果是0.9917,如圖2 所示。
圖2 回歸模型訓(xùn)練結(jié)果圖
上述兩個模型我們都迭代21 次,循環(huán)所有的樣本為1 個周期,每次訓(xùn)練一個周期后都會把測試數(shù)據(jù)的值輸出?;貧w模型與CNN 算法測試準(zhǔn)確率對比結(jié)果如圖3 所示。
圖3 兩種模型準(zhǔn)確率折線圖
從最后的測試準(zhǔn)確率上看,回歸模型最后的準(zhǔn)確率是91%,CNN 算法最后的準(zhǔn)確率是99%。如果從收斂速度上來看,明顯CNN 算法要比回歸模型的收斂速度要快。因此使用卷積CNN 算法使實現(xiàn)分類功能的效果要好得多。
深度學(xué)習(xí)有很多框架,TensorFlow 支持包括手機(jī)在內(nèi)的各種設(shè)備的運(yùn)行,還支持各種語言的編寫。下面的實驗在TensorFlow 框架下進(jìn)行。
首先,要對獲取的車牌圖片進(jìn)行分割處理,可以采用OpenCV 來分割圖像。分割完后獲得圖像是32×40像素的。這樣就采集到了車牌的中文簡稱和26 個字母的圖片數(shù)據(jù)集[7]。如圖4 所示。
圖4 圖片數(shù)據(jù)集
先對車牌上的省份簡稱進(jìn)行訓(xùn)練。訓(xùn)練中記錄了讀取圖片所耗費(fèi)的時間,總共讀取了的訓(xùn)練圖片數(shù)量。這里有個判斷操作是,在每5 次迭代完成之后,準(zhǔn)確度如果達(dá)到了100%,那么退出迭代循環(huán)。
啟動省份簡稱的模型訓(xùn)練,運(yùn)行結(jié)果如圖5 所示。
圖5 車牌省份簡稱的訓(xùn)練結(jié)果圖
之后對車牌上省份簡稱進(jìn)行識別。識別結(jié)果如圖6 所示。可以看到車牌上的省份簡稱被識別出來是“滬”。
圖6 省份簡稱的識別圖
然后進(jìn)行城市代號的訓(xùn)練。同樣的,在每5 次迭代完成之后,準(zhǔn)確度如果達(dá)到了100%,則退出迭代循環(huán)。訓(xùn)練結(jié)果如圖7 所示。
圖7 城市代號的訓(xùn)練結(jié)果圖
進(jìn)行城市代號的識別,其結(jié)果如圖8 所示??梢钥吹杰嚺粕系某鞘写柺恰癘”。
圖8 城市代號的識別結(jié)果圖
最后進(jìn)行車牌編號訓(xùn)練[8]。我國的車牌編號中是沒有字母I 和字母O 的,所以這里只要對24 個字母和10 個數(shù)字進(jìn)行訓(xùn)練。訓(xùn)練結(jié)果如圖9 所示。
圖9 車牌編號的訓(xùn)練結(jié)果圖
圖10 車牌編號的識別結(jié)果圖
在訓(xùn)練結(jié)束之后,我們進(jìn)行車牌編號的識別。結(jié)果如圖10 所示。車牌編號的識別結(jié)果是“67319”,最終車牌上的字符結(jié)果為“滬O67319”??梢钥闯?,CNN 算法在車牌識別上是可行的。
LeNet-5 的網(wǎng)絡(luò)模型以及谷歌的Inception-v3 模型都用到了CNN 算法。大部分的CNN 算法都運(yùn)用到計算機(jī)視覺之中[9]。而近年來,CNN 算法也逐漸應(yīng)用到了自然語言處理中[10]。
CNN 算法應(yīng)用于NLP 任務(wù)中,處理的都是以矩陣形式表達(dá)的文本或句子。例如,有10 個單詞,每個單詞都用128 維向量來表示,之后所得到的10×128 的這個矩陣就相當(dāng)于一副“圖像”[11]。
詞向量的維度是128,那么右邊的6 個卷積核的列數(shù)都是128 列。六個卷積核分別對矩陣進(jìn)行卷積操作,得到6 個feature maps。與圖像非常類似,對它們進(jìn)行最大池化操作,把分割的區(qū)域里的最大值連接起來形成6 個神經(jīng)元。然后進(jìn)行一個全連接層操作,輸出兩個神經(jīng)元。
可以使用自然語言處理來對電影評論進(jìn)行分類。而在電影評論的數(shù)據(jù)集中有兩個樣本:正樣本和負(fù)樣本。正樣本是對電影好的評價,負(fù)樣本是對電影不好的評價。在負(fù)樣本中,每一行一個句子,總共有5000多行。正樣本中也是5000 多行,每一行一個句子。這里迭代20 個周期,每100 次保存一次模型。最多保存5 個模型。然后打印參數(shù),如圖11 所示。
圖11 參數(shù)打印圖
處理數(shù)據(jù),對矩陣做卷積運(yùn)算。建立詞典,把數(shù)據(jù)變成詞典中的編號。對數(shù)據(jù)進(jìn)行切分,10%的數(shù)據(jù)作為用戶集,90%的數(shù)據(jù)及進(jìn)行訓(xùn)練[12]。訓(xùn)練結(jié)果如圖12 所示。
圖12 文本分類訓(xùn)練結(jié)果圖
若不分類,則準(zhǔn)確率只有50%,后面準(zhǔn)確率逐漸提升。在運(yùn)行3000 次后,訓(xùn)練層的準(zhǔn)確率達(dá)到了98%,驗證集的準(zhǔn)確率達(dá)到了73%。因為正樣本和負(fù)樣本加起來總共只有10000 條數(shù)據(jù),樣本比較小,所以有過擬合現(xiàn)象。但總體來說,電影評論的分類是成功的。
本文基于CNN 算法進(jìn)行了深度學(xué)習(xí)的研究與應(yīng)用,所采用的算法在深度學(xué)習(xí)TensorFlow 框架上進(jìn)行了實現(xiàn)。
(1)可以直觀地看到模型的具體構(gòu)造以及更深層的結(jié)構(gòu)。通過研究結(jié)果可以驗證CNN 算法確實比一般的神經(jīng)網(wǎng)絡(luò)在訓(xùn)練與驗證準(zhǔn)確率上要高。
(2)在研究過程中,同時也發(fā)現(xiàn)某些參數(shù)的設(shè)置會影響準(zhǔn)確率的變化,例如增加一個全連接層會使得準(zhǔn)確率上升緩慢,并且波動幅度變得更大。
當(dāng)然,本文在自然語言處理方面的研究還是缺少的,例如聲音識別,特別是CNN 算法應(yīng)用在聲音識別中還需要進(jìn)一步研究。