Tensorflow訓(xùn)練自己的圖像樣本與標(biāo)簽

環(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)。

圖1 部分樣本數(shù)據(jù)

獲取文件名及對應(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é)束)

圖2 獲取樣本

將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)行批量獲取。

圖3 產(chǎn)生訓(xù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個人臉名稱。

圖4 定義權(quán)重與偏置

b.定義訓(xùn)練層及訓(xùn)練模型

采用三層神經(jīng)網(wǎng)絡(luò)進(jìn)行構(gòu)建訓(xùn)練模型。即三種層神經(jīng)網(wǎng)絡(luò),即卷積層Line178、池化層Line183和正則化層Line186

圖5 訓(xùn)練模型

Line189---Line 200后面的注釋標(biāo)識對應(yīng)計算之后的矩陣大小。

c.定義損失、評估及訓(xùn)練方式

圖6 定義損失與評估及訓(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ù)測效果。

圖6 開始訓(xùn)練

5.驗證效果

a.訓(xùn)練后直接驗證效果

將predict1()函數(shù)直接放在 步驟4中“開始訓(xùn)練” 的coord.join(threads) 的后面即可。

圖7 訓(xùn)練后直接驗證

打印的結(jié)果即是jsonData中對應(yīng)的value值,根據(jù)value值找到對應(yīng)的key即可。

b.通過加載訓(xùn)練模板進(jìn)行驗證

圖8 加載訓(xùn)練模型進(jìn)行驗證

到此為止,整個過程結(jié)束。

歡迎與大家共同討論研究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。