邢艷芳,段紅秀,何光威
(中國傳媒大學南廣學院,江蘇 南京 211172)
眾所周知,人工智能將是未來發(fā)展的大方向,深度學習則是人工智能領(lǐng)域的一個重要分支,在圖像和語音識別等領(lǐng)域取得了重要突破。隨著深度學習的發(fā)展,相關(guān)神經(jīng)網(wǎng)絡(luò)模型也不斷推陳出新。TensorFlow是目前主流的深度學習框架,文中以該框架為基礎(chǔ),采用Google MobileNet模型,Ubuntu 16.04開源Linux操作系統(tǒng),CUDA 9.0運算平臺,cuDNN 7.0.5并行架構(gòu),選取從網(wǎng)絡(luò)中爬取的圖片作為數(shù)據(jù)集,進行訓練和識別。
TensorFlow[1-5]是Google公司推出的開源人工智能系統(tǒng),具有靈活性、高效性以及良好的可擴展性、可移植性等特征,可應(yīng)用于從智能手機到大型計算集群的多種計算環(huán)境。
TensorFlow的主要流程是:
(1)產(chǎn)生對應(yīng)的數(shù)據(jù)集。數(shù)據(jù)集可從網(wǎng)上下載公開數(shù)據(jù),也可以通過爬蟲自動化測試或者手工尋找等方式來制作。
(2)對數(shù)據(jù)進行轉(zhuǎn)換和歸一化。將導(dǎo)入的數(shù)據(jù)轉(zhuǎn)換成指定格式,使維度和類型符合TensorFlow直接處理的要求。
(3)劃分數(shù)據(jù)集。將數(shù)據(jù)集劃分成訓練集、測試集以及驗證集。
(4)設(shè)置相關(guān)超參數(shù)。學習過程中需要眾多常量參數(shù),包括迭代次數(shù)(iterations)、學習率(learning rate)、少批量(mini batch)等。
(5)選取變量和占位符。采用占位符(placeholder)得到數(shù)據(jù),調(diào)整變量(variables)、權(quán)重(weights)和偏置(biases),構(gòu)建更優(yōu)化的網(wǎng)絡(luò),并尋求損失函數(shù)(目標函數(shù))的最優(yōu)解。
(6)構(gòu)建模型。根據(jù)參數(shù)和初始化內(nèi)容構(gòu)建模型,通過操作(op)、變量和占位符來建立計算圖。
(7)定義損失函數(shù)。根據(jù)損失函數(shù)(loss function)的決策結(jié)果,得到預(yù)測值與真實值之間的偏差。使用梯度下降算法(gradient descent)和似然函數(shù),避免出現(xiàn)梯度消失和梯度下降。
(8)初始化和訓練模型。采用交叉熵(cross entropy)、驗證和訓練的準確度來評估損失函數(shù)。
TensorFlow的相關(guān)操作有:
(1)創(chuàng)建張量。如表1所示,TensorFlow主要數(shù)據(jù)結(jié)構(gòu)為張量(tensor),基本計算操作包括add()、sub()、mul()和div()。
表1 常規(guī)張量
(2)封裝張量。var=tf.Variable(...),省略號可為自定義張量(tensor)。
(3)通過會話(session)的feed_參數(shù)獲取數(shù)據(jù),讓得出的h為x的實體(identity),實體的返回值為傳入的數(shù)據(jù)本身。
(4)實現(xiàn)激勵函數(shù)操作。表2展示了相關(guān)激活函數(shù)。
表2 相關(guān)激活函數(shù)
(5)卷積函數(shù):用于滑動窗口、步長和卷積核。
(6)剪裁函數(shù):用于剪裁圖像中多余的維度。
(7)損失函數(shù):比較預(yù)測值和目標值的差值。
(8)實現(xiàn)優(yōu)化器。通過二分類算法等方式實現(xiàn)梯度下降,指定合適的學習率,確保機器學習算法收斂。
(9)更新變量以及最小化損失函數(shù)反向傳播誤差,使用較小的學習率(步長)和在一定范圍內(nèi)盡可能多的迭代網(wǎng)絡(luò)會讓訓練易于收斂。
(10)實現(xiàn)線性回歸。
(11)實現(xiàn)邏輯回歸。
在深度學習過程中,如何監(jiān)控算法是一個難點。文中采用TensorFlow中的可視化工具TensorBoard,可以對算法計算過程中的各個流程圖、偏置、權(quán)重以及準確度、交叉熵的參數(shù)通過圖形進行可視化展示。在整體識別程序的啟動后,在命令行輸入以下命令:tensorboard -logdir=retrain_logs。在終端打開一個本地端口http://zwx-Inspiration-5437∶6006,一彈出便為展示頁。TensorBoard配置過程如下:
(1)初始化計算圖,創(chuàng)建write將TensorBoard summary寫入對應(yīng)文件。
(2)確保writer信息寫入相應(yīng)的summary文件夾。
(3)設(shè)置模型參數(shù),讓模型生成所需的數(shù)據(jù)集。
(4)將數(shù)據(jù)集分割為測試集、訓練集以及驗證集。
(5)建立占位符、變量以及模型相關(guān)運算操作、損失值和優(yōu)化操作。
(6)創(chuàng)建TensorBoard的直方圖匯總和標量值匯總。
文中采用深度可分離卷積神經(jīng)網(wǎng)絡(luò)作為深度學習的模型,深度可分離卷積(depth-wise separable convolution)相對傳統(tǒng)卷積方式,減少了參數(shù)數(shù)量,提升了計算速度,降低了過擬合的風險[6-8]。在進行深度可分離卷積的神經(jīng)網(wǎng)絡(luò)設(shè)計中,在有通道分離的情況下,接上一個深度卷積,即可實現(xiàn)空間卷積[9-12]。
在高計算復(fù)雜度下,深度卷積神經(jīng)網(wǎng)絡(luò)相比人的視覺精度更高,將卷積層分解,便于提高效率。傳統(tǒng)卷積層,三維卷積被認為是同時在通道空間卷積和線性通道投影,從而得到高冗余計算。將它們分離后,所需層只包括單個通道卷積和線性通道投影。此外,還提出了在輸入通道和輸出通道之間的拓撲連接框架,以便提高該卷積層的效率。復(fù)雜度遠遠低于標準卷積層,在確保準確性的前提下減少了3-4倍計算量。深度可分離卷積神經(jīng)網(wǎng)絡(luò)支持移動端的使用和開發(fā),更適用于移動設(shè)備便攜式開發(fā)設(shè)計。
較之CPU,GPU更適合一次性進行大量重復(fù)性工作。在深度學習卷積神經(jīng)網(wǎng)絡(luò)中,更多的是加、乘法的計算,使用GPU進行并發(fā)計算可以提高運算效率。因此深度學習可以非常恰當?shù)赜肎PU進行加速。CUDA是NVIDIA公司為了支持GPU而設(shè)計的并行計算架構(gòu),其ISA指令集架構(gòu)和硬件計算引擎讓CUDA更適合并行計算。文中在Ubuntu 16.04系統(tǒng)下,通過配置GPU、CUDA 9.0以及cuDNN 7.0.5的相關(guān)參數(shù),來搭建相關(guān)平臺和并行計算架構(gòu)[13]。
圖像識別相關(guān)參數(shù)如下:
(1)prepare_file_system()函數(shù),準備summary需要的輸出文件夾,summary信息可以通過TensorBoard來看。
(2)model_info=create_model_info(FLAGS.architecture),根據(jù)architecture參數(shù),返回模型的元信息,其中architecture模型采用的是MobileNetV1。
圖像識別相關(guān)算法:
(1)梯度下降優(yōu)化算法:對權(quán)值進行優(yōu)化,在曲線中尋找梯度方向下降最快的位置,來尋找最低點,以便讓損失值最小。梯度下降算法有起始點、搭建平面的形狀和學習率(步長)三個影響因素。
(2)初始化:為了進行有效訓練,讓各層神經(jīng)元方差不變,采用權(quán)值初始化來保證其方差不變性。
(3)偏差/方差(bias/variance):對網(wǎng)絡(luò)優(yōu)化以后,如果網(wǎng)絡(luò)有高偏差/高反差狀態(tài),需要進一步對參數(shù)進行調(diào)整。
(4)正則化(regularization):為了解決高方差和擬合問題,避免神經(jīng)元將非一般特征當作一般規(guī)律學習導(dǎo)致驗證集準確度較低。通過數(shù)據(jù)翻轉(zhuǎn)、比例調(diào)整、亮度調(diào)整、剪裁大小的方法進行數(shù)據(jù)擴充,以獲取更多的訓練樣本,便于訓練和正則化懲罰,減少過擬合和學習非一般規(guī)律的問題。
從數(shù)據(jù)輸入、MobileNet模型再到最后的輸出層,各層神經(jīng)網(wǎng)絡(luò)的實現(xiàn)如圖1所示。
圖1 各層網(wǎng)絡(luò)圖解
數(shù)據(jù)集分為兩部分獲?。旱谝徊糠峙c暴力相關(guān)的包括爭斗、爆炸、槍械、血腥四類,通過網(wǎng)絡(luò)搜索下載的方式,分別存放在fight、explosion、gun、blood目錄下。第二部分與色情(porn)相關(guān)的通過Python實現(xiàn)網(wǎng)絡(luò)爬取,存放在porn目錄下。數(shù)據(jù)集的80%作為訓練樣本,剩下各10%作為測試和驗證樣本。得出識別結(jié)果后,通過交叉熵來判斷識別的準確度,交叉熵越低,證明通過網(wǎng)絡(luò)迭代進行訓練的效果越好[14-15]。通過計算平均值、標準差,得出相關(guān)測試集、訓練集以及驗證集的準確度。如圖2所示,1 000次網(wǎng)絡(luò)迭代的結(jié)果表明訓練集的準確度更好,驗證集的準確度一般。
迭代100次的結(jié)果會發(fā)現(xiàn)交叉熵逐步減少,最后保持在0.15~0.2左右,交叉熵越小,說明預(yù)測值越接近真實值。在學習率0.01更換為0.001以后,發(fā)現(xiàn)驗證集平均準確度從87%上升到89%。在進行1 000次迭代實驗以后,訓練結(jié)果的驗證集準確度在88%左右,學習率為0.001,可見數(shù)據(jù)集較小(總共1 400)對網(wǎng)絡(luò)迭代有一定影響。在進行訓練集、測試集少批量網(wǎng)絡(luò)迭代以后,從原來少批量100變?yōu)?00時,準確度有小幅提高,說明200也為網(wǎng)絡(luò)迭代所能承受的批量,而當少批量數(shù)為300時,測試集準確度卻降低了,可見批量過大時不僅使得計算速度變慢,而且網(wǎng)絡(luò)模型承受力不足。
由圖3數(shù)據(jù)可見,槍械類的識別準確率為0.976,血腥類為0.010,爭斗類為0.010,色情類為0.002,爆炸類為0.000 1,得出該圖是屬于槍械類的敏感圖片。
圖2 驗證集、訓練集準確度圖解
圖3 Matplotlib展示分類槍械類識別結(jié)果圖解
由圖4數(shù)據(jù)可見,爭斗類的識別準確率為0.992,血腥類為0.002,槍械類為0.005,色情類為0.000 4,爆炸類為0.000 2,得出該圖是屬于爭斗類的敏感圖片。
由圖5數(shù)據(jù)可見,爆炸類的識別準確率為0.954,爭斗類為0.000 1,槍械類為0.001,色情類為0.002,血腥類為0.04,得出該圖是屬于爆炸類的敏感圖片。
圖4 Matplotlib展示分類爭斗類識別結(jié)果圖解
圖5 Matplotlib展示分類爆炸類識別結(jié)果圖解
測試結(jié)果顯示,五類圖片相應(yīng)的識別準確度還是很高的,通過模型搭建再到各類權(quán)重、偏置更新,再到算法優(yōu)化,讓識別結(jié)果完整。通過文中設(shè)計的100次網(wǎng)絡(luò)迭代,MobileNet模型測試準確度為86%,更換為Inception_v3模型的測試準確度為87.2%,但是MobileNet模型網(wǎng)絡(luò)迭代周期僅為5分鐘,遠低于Inception_v3模型的迭代周期(30分鐘)。因此,MobileNet在移動端、嵌入端以及網(wǎng)絡(luò)規(guī)模大小和內(nèi)存限制時具有較好的應(yīng)用價值。
文中采用的TensorFlow人工智能框架,便于圖像識別等任務(wù)的實現(xiàn)和開發(fā),測試結(jié)果驗證了該框架的高效性、便捷性以及可行性。隨著深度學習在工業(yè)以及學術(shù)界上的巨大發(fā)展,值得被進一步的學習、研究和探討。