環(huán)境配置:
ubuntu:Ubuntu 16.04.5 LTS x86_64
tensorflow:1.5.0
cv2:3.4.4
基于tensorflow利用卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練自己的圖像樣本數(shù)據(jù)具體步驟如下:
1.獲取樣本文件
2.產(chǎn)生用于訓(xùn)練的批次
3.定義訓(xùn)練的模型(包括初始化參數(shù),卷積、池化層等參數(shù)、網(wǎng)絡(luò))
4.訓(xùn)練
5.驗證
1.讀取圖片文件
圖1是我的部分圖片樣本數(shù)據(jù)的名稱。圖片來源是通過opencv截取的人臉照片,‘-’前部分為測試人臉名稱。大小為(60*60*3)高-寬-顏色通道。由于圖片命名與訓(xùn)練標(biāo)簽有關(guān)。
獲取文件名及對應(yīng)的標(biāo)簽,由于標(biāo)簽是one-hot類型,根據(jù)文件名的“-”前半部分為人的名稱。本想通過直接將名稱的各個字符相加之和作為標(biāo)簽,但是考慮到如果名稱太長,那么和就非常大,不適合使用one-hot作為標(biāo)簽矩陣了。于是改成{文件名前部分:label}的json格式,來實現(xiàn)標(biāo)簽與名稱的映射關(guān)系,待預(yù)測時,根據(jù)標(biāo)簽找到對應(yīng)的名稱即可。
下圖功能是獲取filename目錄下的文件名與文件名對應(yīng)的標(biāo)簽.(還可以加個判斷對應(yīng)的文件是否已jpg結(jié)束)
將jsonData文件名對應(yīng)的索引作為標(biāo)簽,即類別(其數(shù)據(jù)類型要確定,后面要轉(zhuǎn)為tensor類型數(shù)據(jù))。image_list為圖片文件的絕對路徑名稱。
2.產(chǎn)生訓(xùn)練批次
根據(jù)對應(yīng)的文件名讀取內(nèi)容,將其放在文件隊列中。進(jìn)行批量獲取。
首先使用tf.cast轉(zhuǎn)化為tensorflow數(shù)據(jù)格式,使用tf.train.slice_input_producer實現(xiàn)一個輸入的隊列。label不需要處理,image存儲的是路徑,需要讀取為圖片,接下來的幾步就是讀取路徑轉(zhuǎn)為圖片,用于訓(xùn)練。
CNN對圖像大小是敏感的,Line147/148 圖片resize處理為大小一致,Line149將其標(biāo)準(zhǔn)化,即減去所有圖片的均值,方便訓(xùn)練。
接下來使用tf.train.batch函數(shù)產(chǎn)生訓(xùn)練的批次。最后將產(chǎn)生的批次做數(shù)據(jù)類型的轉(zhuǎn)換和shape的處理即可產(chǎn)生用于訓(xùn)練的批次。
有一點比較迷惑:
Line144的label和Line149的image實際上只是一個圖片的標(biāo)簽和對應(yīng)的圖片矩陣,為什么在Line151能夠從一組數(shù)據(jù)中能夠得到batch_size(大于1)個樣本數(shù)據(jù)與標(biāo)簽?zāi)兀浚浚浚浚浚浚浚肯M呷酥更c一下
3.定義訓(xùn)練模型
?a.定義權(quán)重和偏置
??????? 定義最大是64個分類,對應(yīng)的就是64個人臉名稱。
b.定義訓(xùn)練層及訓(xùn)練模型
采用三層神經(jīng)網(wǎng)絡(luò)進(jìn)行構(gòu)建訓(xùn)練模型。即三種層神經(jīng)網(wǎng)絡(luò),即卷積層Line178、池化層Line183和正則化層Line186
Line189---Line 200后面的注釋標(biāo)識對應(yīng)計算之后的矩陣大小。
c.定義損失、評估及訓(xùn)練方式
4.開始訓(xùn)練
采用協(xié)調(diào)器開啟多線程,加速實現(xiàn)對圖片文件的加載讀取與訓(xùn)練。具體方法可以網(wǎng)上搜索一下。同時將訓(xùn)練后的模型保存下來。防止程序掛了之后需要重新訓(xùn)練。測試訓(xùn)練數(shù)據(jù)較少,201次循環(huán)及每次取10個樣本,就可以達(dá)到理想的預(yù)測效果。
5.驗證效果
a.訓(xùn)練后直接驗證效果
將predict1()函數(shù)直接放在 步驟4中“開始訓(xùn)練” 的coord.join(threads) 的后面即可。
打印的結(jié)果即是jsonData中對應(yīng)的value值,根據(jù)value值找到對應(yīng)的key即可。
b.通過加載訓(xùn)練模板進(jìn)行驗證
到此為止,整個過程結(jié)束。
歡迎與大家共同討論研究。