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