InceptionV3遷移學(xué)習(xí):選擇不同tensor作為輸入

本文主要討論的是預(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ì)更加好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容