我正在从作为 Keras 应用程序包含的 VGG16 模型中提取较低级别的功能。这些特征作为附加分类器的预训练输入数据的单独输出导出。这个概念是从Multi-scale recognition with DAG-CNNs中借来的
使用没有分类器顶部的模型,最高级别的特征是从 block_5 拉层中提取的,使用Flatten()
: block_05 = Flatten(name='block_05')(block5_pool)
。这给出了一个维度为 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