高 艷
(山西農業大學信息學院,太谷 030800)
2016年3月,谷歌公司利用卷積神經網絡開發的人工智能圍棋程序Alphago戰勝了圍棋世界冠軍,引起了廣泛的關注[1]。卷積神經網絡作為深度學習的一種方法,在圖像識別、自然語言處理、語音識別等領域有著重要的應用。
神經網絡的研究最早開始于20世紀40年代,之后了一定的低谷期,原因在于軟硬件的限制無法滿足神經網絡的極大的并行計算量。21世紀以來,隨著軟硬件技術的不斷發展,有專門處理圖像的圖像處理器GPU,能夠支持大規模的集群節點計算,在此背景下,谷歌公司開發Tensorflow框架出現并得到了快速發展[2]。文章采用基于Tensorflow框架應用卷積神經網絡對cifar數據集的50,000張圖片進行了處理、建模、訓練、測試等,可以為不同行業的進一步應用打下良好的基礎。
Tensorflow是Google公司發布的開源人工智能深度學習框架,具有可移植性、可擴展性、高效性、靈活性等特點[3]。TensorFlow提供了豐富的構建和訓練機器學習模型的API庫,支持卷積神經網絡(CNN)、循環神經網絡(RNN)、長短期記憶網絡(LSTMN)等深度神經網絡模型。TensorFlow支持C++、Python、Go、Java、Lua、Javascript、R等主流語言,能夠應用到教育、交通、醫療等多個行業[4]。
卷積神經網絡的神經元模型[5]如圖1所示,

圖1 神經元模型
數學公式表達為:

式中,x為輸入;w為權重;b為偏置值;f為激活函數。
卷積神經網絡主要包括輸入層、卷積層、池化層、全連接層、輸出層。卷積和池化過程是為了更好的提取圖像特征。
(1)輸入層:對于圖像識別來說輸入層即我們輸入的原始圖像。
(2)卷基層:卷積是一種有效提取圖片特征的方法。一般用一個正方形卷積核,遍歷圖片上的每一個像素點。圖片與卷積核重合區域內相對應的每一個像素值乘卷積核內相對應點的權重,然后求和,再加上偏置后,最后得到輸出圖片中的一個像素值[6],如圖2所示。

圖2 卷積過程
(3)池化層:卷基層得到的結果并經過激活函數后作為輸入,根據池化核窗口以及滑動步長,求得到圖片在池化核窗口中最大值或者平均值作為輸出,取最大值即為最大池化,取平均值為平均池化,平均池化有利于保留圖片背景的特征。
(4)全連接:池化層得到的結果需要進行拉直后喂入全連接網絡,使用神經元模型公式進行計算即可,即每個輸入值乘以不同的權重求和加偏置并激活經過多次神經網絡連接,并且在訓練過程中需要舍棄一定的神經元節點,之后通過Softmax函數回歸,得到輸出層。

圖3 全連接過程
實驗采用Anaconda軟件,并安裝jupyter環境,以及TensorFlow框架、numpy庫、PIL庫等基礎上完成。
數據采用keras官方下載的cifar-10-batches-py數據集,包含5萬張訓練集圖片和1萬張測試集圖片。圖像大小為32*32的3通道彩色圖像,圖片分為10類,分別為飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、輪船、卡車,如圖4所示。
首先將測試集和訓練集的二進制圖像轉換為jpg格式圖像,具體操作是在打開二進制文件的基礎上用pickle庫對文件進行加載,numpy庫對文件進行處理、用scipy庫對圖形進行保存,通過循環完成所有文件的處理。

圖4 10類圖片
基于TensorFlow的神經網絡,數據用張量(tensor)來表示,神經網絡用計算圖來搭建,用會話執行計算圖,并優化權重得到模型。整個卷積神經網絡模型搭建過程如圖5所示。

圖5 卷積神經網絡模型
具體處理步驟如下:
(1)輸入層:采用第3.2部分中得到的jpg圖像,由于轉換后的數據按順序排列的,需要打亂圖片的順序,并將圖片數據轉換為數組,根據批次100劃分測試集和訓練集,然后喂入神經網絡卷積層。
(2)卷積、池化層:連續采用2次卷積、激活、池化對圖像處理,進行特征提取,卷積層1卷積核大小為5*5,核個數為20,池化層1池化窗口為2*2,步長為2*2,卷積層2的卷積核大小為4*4,核個數為40,池化層2池化窗口為2*2,步長為2*2,之后將數據拉直轉化進入全連接層。Tensorflow中采用tf.layers.conv2d()函數、tf.layers.max_pooling2d()函數完成卷積和池化,用tf.nn.relu()函數完成激活。relu函數的公式[7]為:除relu激活函數外,常用的激活函數有sigmoid和tanh。

(3)全連接:在全連接層中為了防止過擬合現象的發生,加入Dropout,取值為0.25,在模型的訓練過程中暫時舍棄一部分神經元,使用該模型時被舍棄的神經元恢復正常。Tensorflow中使用tf.layers.dropout()來防止過擬合,使用tf.layers.dense()完成全連接,用arg_max()取每行最大值的索引做為預測值。
根據搭建好卷積神經網絡的計算圖,利用Tensorflow的會話(Session)功能運行計算圖,完成樣本訓練。
對模型的好壞評價,可以應用“均方誤差”、“交叉熵”等方法,讓損失函數最小。這里采用“交叉熵”函數來計算訓練的損失,使用AdamOptimizer優化器對于損失進行優化,優化學習率為0.001。Tensorflow中采用tf.nn.softmax_cross_entropy_with_logits()進行交叉熵損失計算,使用tf.train.AdamOptimizer()優化損失函數。
“交叉熵”函數的公式為:

式中,y_代表實際值;y代表預測值。
模型訓練過程需要不斷進行迭代,使得損失盡可能的小,這樣建立的卷積神經網絡模型也就越好。本文進行了2,000輪的迭代之后得到卷積神經網絡的模型。
將測試數據集應用到第3.4部得到的模型中,比較真實的值與模型預測值,查看預測結果的準確率,如果出現準確率比較低的情況,需要調整學習率,激活函數或者加入其他優化方法如滑動平均、正則化等對模型進行進一步的優化。文章經過以上應用模型之后,發現不同圖像的準確率有所不同,如表1所示,其中青蛙識別的準確率最高,為79%,汽車的識別準確率為78%,貓和狗的識別準確率最低,分別為41%和53%,所有圖像識別的平均準確率為65%。
另外,從每一類別圖片被識別為其他錯誤類別的數量發現,飛機和鳥在識別中容易發生混淆,汽車和卡車識別中容易發生混淆,貓和狗容易容易識別中發生混淆,鹿和馬識別中容易發生混淆。

表1 不同種類圖片識別準確率
模型建立及訓練的過程中可以對卷積核的個數、激活函數、學習率、損失函數、訓練輪數不斷調整,最后確定教好的模型。對于不同領域中的圖片,可以使用不同的卷積神經網絡算法,也可以對不同的神經網絡算法進行改進,以更好的應用到相關研究領域中。另外可以進一步使用AlexNet等神經網絡算法對圖片進行識別,提高圖片的分類效果。由于自身條件設備等的不足,論文圖像識別的準確率還有待進一步提高,之后將會進行更深一步的研究。