1. 程式人生 > >利用vgg預訓練模型提取影象特徵

利用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對應位置上修改即可,
在這裡插入圖片描述