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