本文主要討論的是預(yù)訓(xùn)練InceptionV3如何定義不同的輸入以及輸出,并展示了提取不同inception模型節(jié)點(diǎn)的遷移學(xué)習(xí)效果
網(wǎng)上很容易找到關(guān)于InceptionV3模型遷移學(xué)習(xí)的文章
但是這些文章都是一致的讀取JPG作為二進(jìn)制輸入,選擇BOTTLENECK作為輸出,但是我的輸入是一個(gè)圖片矩陣熬尺,不想那么笨的將一個(gè)個(gè)圖片矩陣寫成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的寫入圖函數(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è)圖片矩陣為特征的話需要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)行分類缩焦,我的數(shù)據(jù)集大概有 50000張圖片读虏,分類有16種
(1)將所有圖片輸入到inception模型中,輸出為bottleneck節(jié)點(diǎn)袁滥,然后再建立3層的全連接神經(jīng)網(wǎng)絡(luò)對(duì)這些特征進(jìn)行分類盖桥,實(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)的名稱偎窘,就能夠提取到這部分的特征
將所有圖片輸入網(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)行分類掖肋,我選擇的網(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的輸入分類得到的效果不好费彼,可以嘗試提取更加高維度的特征滑臊,這樣得到的結(jié)果會(huì)更加好