利用google的inception-v3模型作為圖片的特征提取器,將想要分類的圖片輸入到這個已經(jīng)訓(xùn)練好的model里面诈唬,輸出提取的信息韩脏。然后再自己建立一個MLP網(wǎng)絡(luò)對這些信息進(jìn)行分類訓(xùn)練。
例子中用了flower data铸磅,這里面有5種類型的花赡矢,沒有作為訓(xùn)練集出現(xiàn)在inception-v3模型中。從網(wǎng)上下載了這個花的數(shù)據(jù)后阅仔,會發(fā)現(xiàn)這些數(shù)據(jù)都是以jpeg格式存儲的济竹,而且每個圖片的大小不一,所以第一步是要建立一個索引函數(shù)霎槐,將花圖片的地址都提取出來
參考程序是:
TensorFlow實戰(zhàn)Google深度學(xué)習(xí)框架》6.5.2小節(jié) 卷積神經(jīng)網(wǎng)絡(luò)遷移學(xué)習(xí)
但是這個程序的結(jié)構(gòu)弄的比較復(fù)雜,而且在每次得到一張圖片的時候會在文件內(nèi)查找是否遇到過這個圖片梦谜,這種o(n^2)的查找會使得圖片轉(zhuǎn)成特征的時間非常的長丘跌。
在我的程序中袭景,并不查找是否計算過這些圖片,實際上闭树,我的做法是直接將數(shù)據(jù)集內(nèi)的所有圖片輸入到model中轉(zhuǎn)換成特征矩陣耸棒,然后把這個矩陣存起來。后面的步驟就和處理MNIST數(shù)據(jù)一樣簡單了
1.提取目錄下的花圖片的地址
下面的函數(shù)將目錄下的花的圖片按 8:2的比例分成訓(xùn)練集和測試集报辱,注意里面的內(nèi)容是圖片的地址与殃,并不是圖片
2.將圖片地址轉(zhuǎn)換成絕對地址
因為上面的函數(shù)執(zhí)行后的到的地址是各自的文件夾里面圖片的名稱,如果要讀取這些圖片的話需要得到圖片的絕對地址碍现,下面這個函數(shù)就是執(zhí)行這樣的功能的
3.得到圖片的絕對地址后幅疼,就可以讀取這張圖片并將內(nèi)容送入inception model里面提取特征。
因為圖片的大小不一昼接,沒有辦法以矩陣的形式輸入爽篷。當(dāng)然可以對圖片進(jìn)行一下data augment同時統(tǒng)一一下圖片的大小。這樣就可以按batch來讀取圖片并輸入到model里面去慢睡,加快運算
4.上面的函數(shù)出現(xiàn)了兩個tensor逐工,image_tensor是在inception 的圖里面定義的輸入節(jié)點,bottleneck_tensor是倒數(shù)第二層的輸出,當(dāng)然我們需要在程序里面定義這些tensor來自哪里漂辐。這里就用到了網(wǎng)絡(luò)上下載的inception 模型了
5.將得到的特征矩陣保存下來
因為每張圖片輸出的特征都是1*2048泪喊,可以將這些特征組成矩陣,然后用pickle儲存髓涯。這樣就可以得到處理好的特征數(shù)據(jù)袒啼,然后自己建立一個MLP網(wǎng)絡(luò)對這些特征進(jìn)行訓(xùn)練就可以得到很好的效果
6.總結(jié)
實際上程序的邏輯是很簡單的:得到所有圖片的絕對地址 ->一張張的讀取圖片,送入inception model里面計算特征 ->將所有計算出來的特征保存下來
在得到了所有花圖片的特征矩陣后复凳,建立一個兩層的MLP對這些特征進(jìn)行分類瘤泪,在經(jīng)過不到1分鐘的迭代(GPU上運行)就可以達(dá)到90%的準(zhǔn)確率,但是即使增加訓(xùn)練時間育八,準(zhǔn)確率也是維持在90%左右对途。提高準(zhǔn)確率的方向有:
1.數(shù)據(jù)增強,對圖片進(jìn)行翻轉(zhuǎn)髓棋,調(diào)色实檀,隨機(jī)截取等增大訓(xùn)練集
2.得到更高層的inception model輸出,在采用其他模型來訓(xùn)練分類。在這個例子中按声,是用的倒數(shù)第二層的輸出作為特征膳犹,可以去更加上層的輸出作為特征,一般來說签则,越往上的tensor提取的是更廣義的圖片特征(如圖片的輪廓特征等)须床,越靠近輸出的tensor是越針對分類目標(biāo)的特征。