利用vgg預訓練模型提取圖像特徵

VGG卷積神經網絡是牛津大學在2014年提出來的模型。當這個模型被提出時,由於它的簡潔性和實用性,馬上成爲了當時最流行的卷積神經網絡模型。它在圖像分類和目標檢測任務中都表現出非常好的結果。在2014年的ILSVRC比賽中,VGG 在Top-5中取得了92.3%的正確率。有VGG16和VGG19,模型的權重由ImageNet訓練而來
1、VGG結構
在這裏插入圖片描述
下面以VGG16爲例來說明:
在這裏插入圖片描述
看出VGG16由13個卷積層+3個全連接層=16層構成,過程爲:
經過的卷積核大小爲333,stride=1,padding=1,pooling爲採用2x2的max pooling方式。
(1) 輸入:輸入224 * 224 * 3的圖片。
(2) Conv1_1+conv1_2+pool1:經過64個卷積核的兩次卷積後,採用一次max pooling。經過第一次卷積後,有(3 * 3 * 3) * 64=1728個訓練參數;第二次卷積後,有(3 * 3 * 64) * 64=36864個訓練參數,大小變爲112 * 112 * 64.
(3) Conv2_1+conv2_2+pool2:經過兩次128個的卷積核卷積之後,採用一次max pooling,有(3 * 3 * 128) * 128=147456個訓練參數,大小變爲56 * 56 * 128.
(4) Conv3_1+conv3_2+con3_3+pool3: 經過三次256個的卷積核卷積之後,採用一次max pooling,有(3 * 3 * 256) * 256=589824個訓練參數,大小變爲28 * 28 * 256.
(5) Conv4_1+conv4_2+con4_3+pool4: 經過三次512個的卷積核卷積之後,採用一次max pooling,有(3 * 3 * 512) * 512=2359296個訓練參數,大小變爲14 * 14 * 512.
(6) Conv5_1+conv5_2+con5_3+pool5: 再經過三次512個的卷積核卷積之後,採用一次max pooling,有(3 * 3 * 512) * 512=2359296個訓練參數,大小變爲7 * 7 * 512.
(7) Fc6+Fc7+Fc8:經過三次全連接,最終得到1000維的向量。

2、利用tensorflow搭建網絡並提取指定層特徵
包括定義網絡參數,定義卷積層、池化層、全連接層操作,定義網絡結構,等操作,然後根據是分類任務或是其他任務定義損失函數開始訓練等。代碼較長,在此就不列出,會附在附件中,需要的同事可查看。因爲我只需要利用預訓練好的vgg提取圖像的特徵,所以會去掉最後一層softmax,這裏需要提前下載在大的圖像數據集ImageNet上訓練好的網絡權重文件vgg16.npy。加載方法如下:vgg16_npy_path爲vgg16.npy文件的存放路徑,
在這裏插入圖片描述
提取圖像特徵的代碼如下,需要提取哪一層的特徵,就把名字修改一下即可,如:我提取的是fc7層,下面就寫vgg.fc7,每層名字的定義在vgg16.py文件中,到此操作完畢。
在這裏插入圖片描述
3、遇到的問題
在調用vgg16.py函數時,一直報下面這個錯誤:
在這裏插入圖片描述
查找原因發現是因爲split()這個函數在不同版本的tensorflow中參數位置發生了改變,在tensorflow<0.12.0版本中的用法是:
tf.split(axis, num_or_size_splits, value)
在tensorflow>0.12.0版本中的用法是:
tf.split(value, num_or_size_splits, axis)
在vgg16.py對應位置上修改即可,
在這裏插入圖片描述

完整代碼:https://github.com/2281123066/vgg-tensorflow.git
vgg16,vgg19模型下載:
鏈接:https://pan.baidu.com/s/1S0hBs3ioP-TUgd3IS82syQ 密碼:s4po

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章