【问题标题】:Keras VGG16 lower level features extractionKeras VGG16 底层特征提取
【发布时间】:2017-07-28 02:01:24
【问题描述】:

我正在从作为 Keras 应用程序包含的 VGG16 模型中提取较低级别的功能。这些特征作为附加分类器的预训练输入数据的单独输出导出。概念思路借鉴自Multi-scale recognition with DAG-CNNs

使用没有分类器顶部的模型,使用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

【问题讨论】:

  • 这个有趣的方法。您能否更详细地解释一下您想如何使用这些较低层的功能?
  • 更新了关于发布的帖子。输出的合并是在单独的分类器(作为输入)中完成的,因为这样可以对预处理的输入进行优化,以查看哪些特征层对模型的添加最多。

标签: machine-learning neural-network deep-learning keras keras-layer


【解决方案1】:

你提到的内存错误来自于扁平化一个巨大的数组,这使得单元的数量非常大。你真正需要做的是以一种聪明的方式对你的输入进行下采样。我将向您介绍如何做到这一点的一些方法:

  1. MaxPooling:通过简单的池化使用——您可以先对特征图进行下采样,然后再对它们进行Flatten。这种方法的主要优点是简单且不需要额外的参数。主要缺点:这可能是一种非常粗糙的方法。
  2. 智能下采样:在这里您可以添加具有大量子采样的Convolutional2D 层(例如,使用过滤器大小(4, 4) 和子采样(4, 4))。这可能被认为是智能池。这种方法的一个主要缺点是这种方法需要额外的参数。

【讨论】:

  • 我使用的是预训练模型网络权重(迁移学习),因此添加额外的卷积层会带来其他挑战。我将检查通过添加积极的池化层来减少特征向量可以实现什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2019-10-28
  • 2017-09-06
  • 2019-11-14
  • 1970-01-01
  • 2018-07-04
  • 2019-10-26
相关资源
最近更新 更多