我从包含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
这个有趣的方法。你能否更详细地解释你想如何使用这些较低层的功能? –
参考出版物更新后。合并输出是在单独的分类器(作为输入)中完成的,因为然后可以在预处理的输入上运行优化以查看哪些特征层为模型增加最多。 – jdelange