1

我從包含Keras應用程序的VGG16模型中抽取低級特徵。這些功能作爲附加分類器的預先訓練的輸入數據的單獨輸出而導出。概念想法是從Multi-scale recognition with DAG-CNNsKeras VGG16低級特徵提取

使用沒有分類器頂部的模型,使用Flatten()block_05 = Flatten(name='block_05')(block5_pool)從block_5提取層提取最高級別​​的要素。這給出了一個尺寸爲8192的輸出向量。Flatten(),但是在較低的拉伸層上不起作用,因爲尺寸太大(內存問題)。可以使用GlobalAveragePooling2D()block_04 = GlobalAveragePooling2D(name='block_04')(block4_pool)來提取較低的提取層(或任何其他層)。然而,這種方法的問題在於,特徵向量的維度隨着你走低而迅速減小:block_4(512),block_3(256),block_2(128),block_1(64)。

什麼是合適的圖層或設置以保留來自更深層的更多特徵數據?

有關信息,模型的輸出如下所示,附加分類器具有相應數量的輸入。

# Create model, output data in reverse order from top to bottom 
model = Model(input=img_input, output=[block_05, # ch_00, layer 17, dim 8192 
             block_04, # ch_01, layer 13, dim 512 
             block_03, # ch_02, layer 9, dim 256 
             block_02, # ch_03, layer 5, dim 128 
             block_01]) # ch_04, layer 2, dim 64 
+0

這個有趣的方法。你能否更詳細地解釋你想如何使用這些較低層的功能? –

+0

參考出版物更新後。合併輸出是在單獨的分類器(作爲輸入)中完成的,因爲然後可以在預處理的輸入上運行優化以查看哪些特徵層爲模型增加最多。 – jdelange

回答

2

你提到的內存錯誤來自扁平化巨大的數組,這使得單元數量非常大。你真正需要做的是以智能的方式縮減你的輸入​​樣本。我會爲你展示如何做到這一點一些方法:

  1. MaxPooling:由池的簡單的使用 - 你可以先降低採樣率的特徵圖,然後Flatten他們。這種方法的主要優點是簡單並且不需要額外的參數。主要缺點:這可能是一個非常粗糙的方法。智能下采樣:在這裏你可以添加一個Convolutional2D圖層,並帶有巨大的二次採樣(例如,過濾器尺寸爲(4, 4)和子採樣(4, 4))。這可能被認爲是智能池。這種方法的一個主要缺點是需要使用這種方法的附加參數。
+0

我正在使用預先訓練好的模型網絡權重(傳輸學習),因此添加額外的卷積層引入了其他挑戰。我將通過添加積極的池化層來減少特徵向量來檢查我可以實現的目標。 – jdelange