楊美艷 任富順 顧志東
摘 ? 要:深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一種前沿發(fā)展,設(shè)計(jì)主要利用谷歌的tensorflow框架,實(shí)現(xiàn)了對十種花卉的分類和識別。通過已有的大量的花卉圖片素材,編寫卷積神經(jīng)網(wǎng)絡(luò)對花卉圖片訓(xùn)練集進(jìn)行訓(xùn)練,并且將訓(xùn)練后所得模型存放在指定文件夾。再編寫一個(gè)簡潔的python圖形的用戶交互界面,實(shí)現(xiàn)圖片的選擇,根據(jù)訓(xùn)練出來的神經(jīng)網(wǎng)絡(luò)將識別結(jié)果輸出。
關(guān)鍵詞:深度學(xué)習(xí) ?tensorflow;python ?花卉 ?識別
中圖分類號:S68;TP183;TP391 ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A ? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-098X(2020)02(c)-0130-03
目前人類在實(shí)現(xiàn)人工智能的道路上不斷地探索和創(chuàng)新,發(fā)明出了很多方法來實(shí)現(xiàn)人工智能,機(jī)器學(xué)習(xí)就是其中的一種。機(jī)器學(xué)習(xí)可以說是讓機(jī)器來模擬人類的學(xué)習(xí)行為,重組現(xiàn)有的知識結(jié)構(gòu),通過現(xiàn)有的知識去學(xué)習(xí)新的知識。深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一種前沿發(fā)展。
此設(shè)計(jì)在Ubuntu上進(jìn)行,編程語言是python,利用tensorflow這個(gè)谷歌框架,在Jupyter notebook上進(jìn)行編寫。
1 ?系統(tǒng)設(shè)計(jì)思路
系統(tǒng)是一個(gè)基于tensorflow這個(gè)谷歌深度學(xué)習(xí)框架的程序,這個(gè) 程序可以對指定的十種花卉進(jìn)行分類和識別。核心思路是先設(shè)計(jì)一個(gè)卷積神經(jīng)網(wǎng)絡(luò),這個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)是兩個(gè)卷積層、兩個(gè)池化層、三個(gè)全連接層。將事先收集好的圖片集根據(jù)種類打上不同的標(biāo)簽,將標(biāo)簽和圖片這兩個(gè)列表組合為一個(gè)輸入數(shù)據(jù)隊(duì)列,隊(duì)列在分批次地送入神經(jīng)網(wǎng)絡(luò)中訓(xùn)練得到模型后,將模型保存在指定文件夾。再根據(jù)已有的模型來識別。
設(shè)計(jì)的核心就是卷積神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì),設(shè)計(jì)所用的卷積神經(jīng)網(wǎng)絡(luò)是由兩個(gè)卷積層,兩個(gè)池化層,三個(gè)全連接層組成。神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如圖1所示。
要想有一個(gè)神經(jīng)網(wǎng)絡(luò)來達(dá)到輸入一張圖片就能識別出這張圖片的效果,就需要訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò),訓(xùn)練神經(jīng)網(wǎng)絡(luò)這個(gè)過程的實(shí)質(zhì)就是設(shè)置神經(jīng)網(wǎng)絡(luò)中的參數(shù)值,合理有效的神經(jīng)網(wǎng)絡(luò)才能實(shí)現(xiàn)識別。系統(tǒng)中使用監(jiān)督學(xué)習(xí)的方式來訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò)。使用前向傳播算法來獲得預(yù)測值,再用損失函數(shù)表示計(jì)算預(yù)測值和正確答案之間的差距,使用反向傳播算法和梯度下降算法來調(diào)整網(wǎng)絡(luò)中的參數(shù),訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的流程圖如圖2所示。
2 ?系統(tǒng)各模塊具體實(shí)現(xiàn)
在以下的論述中,將依次展現(xiàn)各個(gè)功能模塊的具體設(shè)計(jì)及實(shí)現(xiàn)。
2.1 圖片處理
2.1.1 圖片的采集
要事先收集這10種花的大量圖片,放在指定文件夾里,作為訓(xùn)練集,圖片數(shù)量不能太少,因?yàn)榛ɑ艿膱D片屬于像素較高,比較復(fù)雜的圖片,如果訓(xùn)練用的圖片不夠多,訓(xùn)練出來的神經(jīng)網(wǎng)絡(luò)模型會因?yàn)橛?xùn)練不足而識別準(zhǔn)確率較低。
2.1.2 創(chuàng)建標(biāo)簽分類函數(shù)
因?yàn)楸菊n題中對神經(jīng)網(wǎng)絡(luò)的訓(xùn)練方式的監(jiān)督學(xué)習(xí)的方式,所以所有訓(xùn)練的圖片都是事先知道分類的,那么需要一個(gè)函數(shù)來給每一種圖片打上對應(yīng)的不同的標(biāo)簽, 以此來表示分類的正確結(jié)果。
2.1.3 獲取圖片批次函數(shù)
將圖片分批次地傳入神經(jīng)網(wǎng)絡(luò)里訓(xùn)練,這種方式提高了內(nèi)存利用率。需要定義一個(gè)get_batch( )來一批批地獲取數(shù)據(jù),在分成一個(gè)個(gè)batch之前,先要將圖片集和標(biāo)簽集都轉(zhuǎn)換成tensorflow可識別的格式。
2.2 卷積神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)
2.2.1 卷積層
卷積核尺寸是3×3的,卷積核的深度是16,而偏差biases的深度也是16,而且被賦初試值為0.1。tf.nn.conv2d這個(gè)函數(shù)提供了一個(gè)十分方便的實(shí)現(xiàn)卷積層并且向前傳播的方法,這個(gè)函數(shù)第一個(gè)輸入是圖片解碼后的像素矩陣,tf.nn.conv2d的第二個(gè)輸入是卷積層的權(quán)重weights,第三個(gè)輸入是卷積核在不同維度上的步長,程序里的strides=[1,1,1,1]表示卷積核每次沿著x軸和沿著y軸挪動(dòng)的時(shí)候挪動(dòng)單位長度為1。在卷積核處理圖片的時(shí)候,有的時(shí)候因?yàn)閳D片大小問題或者步數(shù)設(shè)置問題導(dǎo)致不可能將每個(gè)方向所有的部分都處理完,這時(shí)候可以選擇是否對圖片邊緣進(jìn)行補(bǔ)零處理,padding這個(gè)參數(shù)的設(shè)置就是選擇是否進(jìn)行對圖片四周補(bǔ)零,當(dāng) padding=valid時(shí)不添加零,padding=same時(shí)添加零。
2.2.2 池化層
池化層的優(yōu)點(diǎn)就是可以非常有效的縮小矩陣的尺寸,而且可以保留相對主要的特征,減少下一層要處理的參數(shù)。和卷積層有些類似,池化層的向前傳播也是通過一個(gè)類似于卷積核這樣的過濾器的結(jié)構(gòu)完成的。目前實(shí)踐中使用的最多的池化是最大池化和平均池化。和卷積層一樣,池化層過濾器這些參數(shù)也要設(shè)置,例如是否用零填充、過濾器的尺寸為多少、過濾器步數(shù)為多少。
卷積層conv2接著對上一個(gè)池化層作處理,卷積核的尺寸為3×3,深度為16,在這一層選擇了使用全0補(bǔ)充。池化層2過濾器大小為3×3,深度為16,也選擇了全0補(bǔ)充。
2.2.3 全連接層local3和local4
本設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)中有兩個(gè)全連接層,全連接層的結(jié)點(diǎn)和前一層的所有結(jié)點(diǎn)都是相互連接的。
全連接層local3的輸入是前一層,即池化層pool2層的輸出,池化層向全連接層實(shí)現(xiàn)前向傳播的方式很簡單,就是利用前面所說的矩陣乘法。但是因?yàn)槌鼗瘜拥妮敵鍪且粋€(gè)矩陣,而全連接的輸入格式要求向量,所以通過tf.reshape()將矩陣?yán)背蔀橐粋€(gè)向量。
全連接層local4的輸入是一個(gè)向量,所以不用進(jìn)行拉直處理,實(shí)現(xiàn)全連接層local3向全連接層local4的前向傳播和上面一樣,用矩陣乘法就可以了。
2.2.4 全連接層softmax_linear
系統(tǒng)以10種花卉為識別對象,卷積神經(jīng)網(wǎng)絡(luò)的輸出有十種情況,代表10種不同的花卉,所以需要有一層來完成分類任務(wù),即這一層輸出數(shù)量是10,這層輸出可以被tf.nn.softmax_cross_entropy_with_logits函數(shù)直接處理。這一層的輸出是一個(gè)長為n_classes的向量,其中n_classes為分類結(jié)果個(gè)數(shù),這一層的輸出通過softmax函數(shù)處理和計(jì)算出交叉熵后就能得到最終的結(jié)果。
2.3 訓(xùn)練神經(jīng)網(wǎng)絡(luò)
2.3.1 獲取損失函數(shù)(loss)
訓(xùn)練神經(jīng)網(wǎng)絡(luò)是本課題的核心環(huán)節(jié),一個(gè)網(wǎng)絡(luò)的好壞決定了預(yù)測結(jié)果的可信度的高低。前面提到了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程實(shí)際就是在迭代地修改網(wǎng)絡(luò)中參數(shù)的過程,而對一個(gè)網(wǎng)絡(luò)的參數(shù)的修改離不開損失函數(shù)(train_loss),那么在訓(xùn)練網(wǎng)絡(luò)之前需要先定義損失函數(shù)。在原始輸出被softmax函數(shù)轉(zhuǎn)換成概率分布并且計(jì)算出交叉熵后,再對這一批數(shù)據(jù)的交叉熵用函數(shù)tf.reduce_mean方法求取平均值,因?yàn)榍笕∑骄悼梢詼p小誤差,最后將這個(gè)平均值作為這一批數(shù)據(jù)的訓(xùn)練損失返回。
二、優(yōu)化神經(jīng)網(wǎng)絡(luò)
系統(tǒng)使用梯度下降算法來優(yōu)化網(wǎng)絡(luò),所以需要先定義網(wǎng)絡(luò)優(yōu)化算法,即定義參數(shù)迭代改變的算法。
在定義完一切需要的函數(shù)后,可以開始訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型了,先定義訓(xùn)練所用圖片集的文件夾和保存神經(jīng)網(wǎng)絡(luò)的文件夾,通過之前定義的文件處理函數(shù)和獲取批次函數(shù)來獲取訓(xùn)練時(shí)的圖片批次和標(biāo)簽批次。每訓(xùn)練100步,輸出當(dāng)前的訓(xùn)練損失和識別準(zhǔn)確率,每隔2000步保存一下網(wǎng)絡(luò)模型,網(wǎng)絡(luò)模型保存'/home/huanhuan/SaveNet/' 目錄下,保存為.pb格式的文件,名字為model.ckpt。tensorflow有兩種方式來實(shí)現(xiàn)對訓(xùn)練出來的網(wǎng)絡(luò)模型的保存,第一種方式是生成檢查點(diǎn)文件,該文件的擴(kuò)展名通常為.ckpt,通過在tf.train.Saver對象上直接用Saver.saver()生成,這種方法不僅僅保存了一些權(quán)值,也保存了許多定義的變量。第二種方式就是生成圖協(xié)議文件(graph proto file),這種文件擴(kuò)展名一般為.pb,用這種方式生成的文件是圖協(xié)議文件,也就是只保存圖形結(jié)構(gòu)不保存權(quán)重,用方法tf.train.write_graph()來保存。
3.4 圖片識別功能的實(shí)現(xiàn)結(jié)果
如上圖是成功分類的例子,系統(tǒng)經(jīng)過訓(xùn)練,能正確地輸出了幾張圖片所屬類別,并且通過消息框給出成功識別的提示。
參考文獻(xiàn)
[1] 伍錫如,雪剛剛,劉英璇.基于深度學(xué)習(xí)的水果采摘機(jī)器人視覺識別系統(tǒng)設(shè)計(jì)[J].農(nóng)機(jī)化研究,2020(02):177-182+188.
[2] 王雪, 隋立春, 鐘棉卿, 等. 全卷積神經(jīng)網(wǎng)絡(luò)用于遙感影像水體提取[J]. 測繪通報(bào), 2018.
[3] Ian G, Yoshua B, Aaron C. 趙申劍, 黎彧君, 符天凡, 等, 譯. 深度學(xué)習(xí)[M]. 北京: 人民郵電出版社, 2017.
[4] Yiqun Dong. Implementing Deep Learning for comprehensive aircraft icing and actuator/sensor fault detection/Identification[J].Engineering Applications of Artificial Intelligence,2019,83.
[5] 李超人.基于機(jī)器學(xué)習(xí)的圖像檢測分析[J].科學(xué)技術(shù)創(chuàng)新,2019(16):90-91.
[6] 李昱鋒,李建宏,文永明.基于TensorFlow的K-means算法的研究[J].信息技術(shù)與網(wǎng)絡(luò)安全,2019(05):37-41.
[7] 陳鑾雄,高遠(yuǎn)鵬,廖艷娟,黃劍華,程廣展,王師克.基于TensorFlow機(jī)器學(xué)習(xí)平臺的綜合接入機(jī)房規(guī)劃方法研究[J].電信技術(shù),2019(04):12-14.