高 艷
(山西農(nóng)業(yè)大學(xué)信息學(xué)院,太谷 030800)
2016年3月,谷歌公司利用卷積神經(jīng)網(wǎng)絡(luò)開(kāi)發(fā)的人工智能?chē)宄绦駻lphago戰(zhàn)勝了圍棋世界冠軍,引起了廣泛的關(guān)注[1]。卷積神經(jīng)網(wǎng)絡(luò)作為深度學(xué)習(xí)的一種方法,在圖像識(shí)別、自然語(yǔ)言處理、語(yǔ)音識(shí)別等領(lǐng)域有著重要的應(yīng)用。
神經(jīng)網(wǎng)絡(luò)的研究最早開(kāi)始于20世紀(jì)40年代,之后了一定的低谷期,原因在于軟硬件的限制無(wú)法滿(mǎn)足神經(jīng)網(wǎng)絡(luò)的極大的并行計(jì)算量。21世紀(jì)以來(lái),隨著軟硬件技術(shù)的不斷發(fā)展,有專(zhuān)門(mén)處理圖像的圖像處理器GPU,能夠支持大規(guī)模的集群節(jié)點(diǎn)計(jì)算,在此背景下,谷歌公司開(kāi)發(fā)Tensorflow框架出現(xiàn)并得到了快速發(fā)展[2]。文章采用基于Tensorflow框架應(yīng)用卷積神經(jīng)網(wǎng)絡(luò)對(duì)cifar數(shù)據(jù)集的50,000張圖片進(jìn)行了處理、建模、訓(xùn)練、測(cè)試等,可以為不同行業(yè)的進(jìn)一步應(yīng)用打下良好的基礎(chǔ)。
Tensorflow是Google公司發(fā)布的開(kāi)源人工智能深度學(xué)習(xí)框架,具有可移植性、可擴(kuò)展性、高效性、靈活性等特點(diǎn)[3]。TensorFlow提供了豐富的構(gòu)建和訓(xùn)練機(jī)器學(xué)習(xí)模型的API庫(kù),支持卷積神經(jīng)網(wǎng)絡(luò)(CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTMN)等深度神經(jīng)網(wǎng)絡(luò)模型。TensorFlow支持C++、Python、Go、Java、Lua、Javascript、R等主流語(yǔ)言,能夠應(yīng)用到教育、交通、醫(yī)療等多個(gè)行業(yè)[4]。
卷積神經(jīng)網(wǎng)絡(luò)的神經(jīng)元模型[5]如圖1所示,
圖1 神經(jīng)元模型
數(shù)學(xué)公式表達(dá)為:
式中,x為輸入;w為權(quán)重;b為偏置值;f為激活函數(shù)。
卷積神經(jīng)網(wǎng)絡(luò)主要包括輸入層、卷積層、池化層、全連接層、輸出層。卷積和池化過(guò)程是為了更好的提取圖像特征。
(1)輸入層:對(duì)于圖像識(shí)別來(lái)說(shuō)輸入層即我們輸入的原始圖像。
(2)卷基層:卷積是一種有效提取圖片特征的方法。一般用一個(gè)正方形卷積核,遍歷圖片上的每一個(gè)像素點(diǎn)。圖片與卷積核重合區(qū)域內(nèi)相對(duì)應(yīng)的每一個(gè)像素值乘卷積核內(nèi)相對(duì)應(yīng)點(diǎn)的權(quán)重,然后求和,再加上偏置后,最后得到輸出圖片中的一個(gè)像素值[6],如圖2所示。
圖2 卷積過(guò)程
(3)池化層:卷基層得到的結(jié)果并經(jīng)過(guò)激活函數(shù)后作為輸入,根據(jù)池化核窗口以及滑動(dòng)步長(zhǎng),求得到圖片在池化核窗口中最大值或者平均值作為輸出,取最大值即為最大池化,取平均值為平均池化,平均池化有利于保留圖片背景的特征。
(4)全連接:池化層得到的結(jié)果需要進(jìn)行拉直后喂入全連接網(wǎng)絡(luò),使用神經(jīng)元模型公式進(jìn)行計(jì)算即可,即每個(gè)輸入值乘以不同的權(quán)重求和加偏置并激活經(jīng)過(guò)多次神經(jīng)網(wǎng)絡(luò)連接,并且在訓(xùn)練過(guò)程中需要舍棄一定的神經(jīng)元節(jié)點(diǎn),之后通過(guò)Softmax函數(shù)回歸,得到輸出層。
圖3 全連接過(guò)程
實(shí)驗(yàn)采用Anaconda軟件,并安裝jupyter環(huán)境,以及TensorFlow框架、numpy庫(kù)、PIL庫(kù)等基礎(chǔ)上完成。
數(shù)據(jù)采用keras官方下載的cifar-10-batches-py數(shù)據(jù)集,包含5萬(wàn)張訓(xùn)練集圖片和1萬(wàn)張測(cè)試集圖片。圖像大小為32*32的3通道彩色圖像,圖片分為10類(lèi),分別為飛機(jī)、汽車(chē)、鳥(niǎo)、貓、鹿、狗、青蛙、馬、輪船、卡車(chē),如圖4所示。
首先將測(cè)試集和訓(xùn)練集的二進(jìn)制圖像轉(zhuǎn)換為jpg格式圖像,具體操作是在打開(kāi)二進(jìn)制文件的基礎(chǔ)上用pickle庫(kù)對(duì)文件進(jìn)行加載,numpy庫(kù)對(duì)文件進(jìn)行處理、用scipy庫(kù)對(duì)圖形進(jìn)行保存,通過(guò)循環(huán)完成所有文件的處理。
圖4 10類(lèi)圖片
基于TensorFlow的神經(jīng)網(wǎng)絡(luò),數(shù)據(jù)用張量(tensor)來(lái)表示,神經(jīng)網(wǎng)絡(luò)用計(jì)算圖來(lái)搭建,用會(huì)話執(zhí)行計(jì)算圖,并優(yōu)化權(quán)重得到模型。整個(gè)卷積神經(jīng)網(wǎng)絡(luò)模型搭建過(guò)程如圖5所示。
圖5 卷積神經(jīng)網(wǎng)絡(luò)模型
具體處理步驟如下:
(1)輸入層:采用第3.2部分中得到的jpg圖像,由于轉(zhuǎn)換后的數(shù)據(jù)按順序排列的,需要打亂圖片的順序,并將圖片數(shù)據(jù)轉(zhuǎn)換為數(shù)組,根據(jù)批次100劃分測(cè)試集和訓(xùn)練集,然后喂入神經(jīng)網(wǎng)絡(luò)卷積層。
(2)卷積、池化層:連續(xù)采用2次卷積、激活、池化對(duì)圖像處理,進(jìn)行特征提取,卷積層1卷積核大小為5*5,核個(gè)數(shù)為20,池化層1池化窗口為2*2,步長(zhǎng)為2*2,卷積層2的卷積核大小為4*4,核個(gè)數(shù)為40,池化層2池化窗口為2*2,步長(zhǎng)為2*2,之后將數(shù)據(jù)拉直轉(zhuǎn)化進(jìn)入全連接層。Tensorflow中采用tf.layers.conv2d()函數(shù)、tf.layers.max_pooling2d()函數(shù)完成卷積和池化,用tf.nn.relu()函數(shù)完成激活。relu函數(shù)的公式[7]為:除relu激活函數(shù)外,常用的激活函數(shù)有sigmoid和tanh。
(3)全連接:在全連接層中為了防止過(guò)擬合現(xiàn)象的發(fā)生,加入Dropout,取值為0.25,在模型的訓(xùn)練過(guò)程中暫時(shí)舍棄一部分神經(jīng)元,使用該模型時(shí)被舍棄的神經(jīng)元恢復(fù)正常。Tensorflow中使用tf.layers.dropout()來(lái)防止過(guò)擬合,使用tf.layers.dense()完成全連接,用arg_max()取每行最大值的索引做為預(yù)測(cè)值。
根據(jù)搭建好卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算圖,利用Tensorflow的會(huì)話(Session)功能運(yùn)行計(jì)算圖,完成樣本訓(xùn)練。
對(duì)模型的好壞評(píng)價(jià),可以應(yīng)用“均方誤差”、“交叉熵”等方法,讓損失函數(shù)最小。這里采用“交叉熵”函數(shù)來(lái)計(jì)算訓(xùn)練的損失,使用AdamOptimizer優(yōu)化器對(duì)于損失進(jìn)行優(yōu)化,優(yōu)化學(xué)習(xí)率為0.001。Tensorflow中采用tf.nn.softmax_cross_entropy_with_logits()進(jìn)行交叉熵?fù)p失計(jì)算,使用tf.train.AdamOptimizer()優(yōu)化損失函數(shù)。
“交叉熵”函數(shù)的公式為:
式中,y_代表實(shí)際值;y代表預(yù)測(cè)值。
模型訓(xùn)練過(guò)程需要不斷進(jìn)行迭代,使得損失盡可能的小,這樣建立的卷積神經(jīng)網(wǎng)絡(luò)模型也就越好。本文進(jìn)行了2,000輪的迭代之后得到卷積神經(jīng)網(wǎng)絡(luò)的模型。
將測(cè)試數(shù)據(jù)集應(yīng)用到第3.4部得到的模型中,比較真實(shí)的值與模型預(yù)測(cè)值,查看預(yù)測(cè)結(jié)果的準(zhǔn)確率,如果出現(xiàn)準(zhǔn)確率比較低的情況,需要調(diào)整學(xué)習(xí)率,激活函數(shù)或者加入其他優(yōu)化方法如滑動(dòng)平均、正則化等對(duì)模型進(jìn)行進(jìn)一步的優(yōu)化。文章經(jīng)過(guò)以上應(yīng)用模型之后,發(fā)現(xiàn)不同圖像的準(zhǔn)確率有所不同,如表1所示,其中青蛙識(shí)別的準(zhǔn)確率最高,為79%,汽車(chē)的識(shí)別準(zhǔn)確率為78%,貓和狗的識(shí)別準(zhǔn)確率最低,分別為41%和53%,所有圖像識(shí)別的平均準(zhǔn)確率為65%。
另外,從每一類(lèi)別圖片被識(shí)別為其他錯(cuò)誤類(lèi)別的數(shù)量發(fā)現(xiàn),飛機(jī)和鳥(niǎo)在識(shí)別中容易發(fā)生混淆,汽車(chē)和卡車(chē)識(shí)別中容易發(fā)生混淆,貓和狗容易容易識(shí)別中發(fā)生混淆,鹿和馬識(shí)別中容易發(fā)生混淆。
表1 不同種類(lèi)圖片識(shí)別準(zhǔn)確率
模型建立及訓(xùn)練的過(guò)程中可以對(duì)卷積核的個(gè)數(shù)、激活函數(shù)、學(xué)習(xí)率、損失函數(shù)、訓(xùn)練輪數(shù)不斷調(diào)整,最后確定教好的模型。對(duì)于不同領(lǐng)域中的圖片,可以使用不同的卷積神經(jīng)網(wǎng)絡(luò)算法,也可以對(duì)不同的神經(jīng)網(wǎng)絡(luò)算法進(jìn)行改進(jìn),以更好的應(yīng)用到相關(guān)研究領(lǐng)域中。另外可以進(jìn)一步使用AlexNet等神經(jīng)網(wǎng)絡(luò)算法對(duì)圖片進(jìn)行識(shí)別,提高圖片的分類(lèi)效果。由于自身?xiàng)l件設(shè)備等的不足,論文圖像識(shí)別的準(zhǔn)確率還有待進(jìn)一步提高,之后將會(huì)進(jìn)行更深一步的研究。