本文主要討論的是預(yù)訓(xùn)練InceptionV3如何定義不同的輸入以及輸出,并展示了提取不同inception模型節(jié)點(diǎn)的遷移學(xué)習(xí)效果
網(wǎng)上很容易找到關(guān)于InceptionV3模型遷移學(xué)習(xí)的文章
但是這些文章都是一致的讀取JPG作為二進(jìn)制輸入,選擇BOTTLENECK作為輸出,但是我的輸入是一個(gè)圖片矩陣,不想那么笨的將一個(gè)個(gè)圖片矩陣寫(xiě)成JPG圖片,就對(duì)InceptionV3
的結(jié)構(gòu)進(jìn)行了一下探索
1.常規(guī)的加載模型的PB文件,定義各tensor

主要問(wèn)題是假如我的輸入是矩陣,不能直接用參考文章中的JPEG_INPUT作為輸入。那么要怎么找到這個(gè)矩陣tensor的定義呢?
我的想法是,既然加載了模型到計(jì)算圖中,利用tensorboard強(qiáng)大的功能,可以顯示計(jì)算圖的結(jié)構(gòu),那么從這個(gè)結(jié)構(gòu)中就知道怎么定義不同格式的輸入了
2.得到計(jì)算圖
只需要定義與加載好InceptionV3的模型后,利用常規(guī)的tensorboard的寫(xiě)入圖函數(shù)就能得到計(jì)算圖

然后打開(kāi)tensorboard就能得到圖結(jié)構(gòu)

然后我們仔細(xì)看stem的輸入部分

可以看到假如我們直接讀取JPG文件,輸入到計(jì)算圖中的是一個(gè)標(biāo)量
DecodeJpeg/contents:0
因?yàn)槲业妮斎刖褪?一 N*229*229*3的圖片矩陣,我想要直接將這個(gè)矩陣輸入到計(jì)算圖中,仔細(xì)看圖的結(jié)構(gòu)

會(huì)看到Cast節(jié)點(diǎn)可以接受任意尺寸的矩陣輸入,然后再擴(kuò)展維度為 (1,?,?,3)的圖片矩陣,最后統(tǒng)一resize為(1,229,229,3)的圖片矩陣
所以也就是說(shuō)這個(gè)模型時(shí)不支持batch輸入的,必須要一張一張或者是一個(gè)一個(gè)圖片矩陣輸入才可以。
因?yàn)槲业妮斎刖褪?229*229*3的矩陣,那么直接定義想要用的節(jié)點(diǎn)

ExpandDims:0
作為輸入就可以,輸入可以是任意的H,W,只需要保證輸入格式是(1,H,W,3)就可以了
同理,可以修改想要的輸出節(jié)點(diǎn)

文章后面嘗試了pool_3的輸入節(jié)點(diǎn)作為特征,并比較了效果
效果

我的face_img是一個(gè)(10000,229,229,3)的大矩陣,需要一個(gè)個(gè)的輸入這個(gè)圖片矩陣
大概轉(zhuǎn)換一個(gè)圖片矩陣為特征的話(huà)需要0.2秒的時(shí)間
實(shí)驗(yàn):
inception 不同節(jié)點(diǎn)的遷移學(xué)習(xí)
1.只提取BottleNeck的輸出,也就是圖片提取的特征為(1,2048)
當(dāng)前我的項(xiàng)目上剛好需要對(duì)一個(gè)新的數(shù)據(jù)集進(jìn)行分類(lèi),我的數(shù)據(jù)集大概有 50000張圖片,分類(lèi)有16種
(1)將所有圖片輸入到inception模型中,輸出為bottleneck節(jié)點(diǎn),然后再建立3層的全連接神經(jīng)網(wǎng)絡(luò)對(duì)這些特征進(jìn)行分類(lèi),實(shí)驗(yàn)結(jié)果還是效果不錯(cuò),以及比自己重新建立一個(gè)CNN網(wǎng)絡(luò)的表現(xiàn)要好了,在經(jīng)過(guò)比較短的時(shí)間訓(xùn)練后在驗(yàn)證集上的到了80%左右的準(zhǔn)確率。
由于訓(xùn)練的是全連接神經(jīng)網(wǎng)絡(luò),增加訓(xùn)練時(shí)間很可能會(huì)使得網(wǎng)絡(luò)過(guò)擬合,所以這個(gè)方法的準(zhǔn)確率大概為80%,效果已經(jīng)很好了


2.提取更靠前節(jié)點(diǎn)的輸出
按照inceptionv3的計(jì)算圖結(jié)構(gòu),可以看到bottleneck前面接的是一個(gè)pool層,pool層前面是一個(gè)inception block,我選擇提取池化前的特征,特征維度為 (1,8,8,2048)
按照前面所說(shuō)的方法,找點(diǎn)這個(gè)節(jié)點(diǎn)的名稱(chēng),就能夠提取到這部分的特征


將所有圖片輸入網(wǎng)絡(luò),提取出這個(gè)節(jié)點(diǎn)的特征后保存
提取的特征維度為 : (50000,8,8,2048)且每個(gè)數(shù)為32位浮點(diǎn)數(shù),假如一次加載到內(nèi)存中大概需要25GB的內(nèi)存,所以我選擇將這些特征數(shù)據(jù)分成10小份,每份大小為2.5G左右
然后訓(xùn)練一個(gè)卷積網(wǎng)絡(luò)對(duì)這些特征進(jìn)行分類(lèi),我選擇的網(wǎng)絡(luò)結(jié)構(gòu)為:
conv1:? ? ? ? ? ? ? ? 2048@3*3/1? ? ? ? ? ? ? ? (N,8,8,2048)? ->? ? (N,6,6,2048)
conv2:? ? ? ? ? ? ? ? 2048@3*3/1? ? ? ? ? ? ? ? (N,6,6,2048)? ->? ? (N,4,4,2048)
conv3:? ? ? ? ? ? ? ? 2048@3*3/1? ? ? ? ? ? ? ? (N,4,4,2048)? ->? ? (N,2,2,2048)
FC4:?????????????????????? 2048???????????????????????????? (N,2*2*2048)???? ->?????? (N,2048)
FC5:? ? ? ? ? ? ? ? ? ? ? ? 1024???????????????????????????? (N,2048)? ????????? ->? ? ? (N,1024)
FC6:? ? ? ? ? ? ? ? ? ? ? ? 16? ? ? ? ? ? ? ? ? ? ? ? ? ????? (N,1024)? ? ? ? ? ? ->? ? ? (N,16)
最后輸出為 FC6層
在經(jīng)過(guò)5小時(shí)的訓(xùn)練后,網(wǎng)絡(luò)在驗(yàn)證集上的準(zhǔn)確率大概收斂在93%左右。這還只是粗略的訓(xùn)練,沒(méi)有對(duì)網(wǎng)絡(luò)進(jìn)行調(diào)參


結(jié)論:
假如你在自己的項(xiàng)目上有比較小的數(shù)據(jù)集,而又想利用深度學(xué)習(xí)方案解決這個(gè)問(wèn)題,這時(shí)候利用遷移學(xué)習(xí)得到的結(jié)果肯定是比重新訓(xùn)練一個(gè)新的CNN網(wǎng)絡(luò)要好很多。假如只利用BOTTLENECK的輸入分類(lèi)得到的效果不好,可以嘗試提取更加高維度的特征,這樣得到的結(jié)果會(huì)更加好