Keras VGG16 底层特征提取
Keras VGG16 lower level features extraction
我正在从作为 Keras 应用程序包含的 VGG16 模型中提取较低级别的功能。这些特征作为附加分类器的预训练输入数据的单独输出导出。概念上的想法是从 Multi-scale recognition with DAG-CNNs
借来的
使用没有分类器 top 的模型,使用 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
您提到的内存错误来自于将一个巨大的数组展平,这使得单元数非常大。您实际需要做的是以一种聪明的方式对您的输入进行下采样。我将向您介绍如何执行此操作的一些方法:
MaxPooling
:通过简单地使用池化——你可以先对你的特征图进行下采样,然后 Flatten
它们。这种方法的主要优点是它的简单性和不需要额外的参数。主要缺点:这可能是一个非常粗糙的方法。
- 智能下采样:在这里您可以添加一个
Convolutional2D
具有大量子采样的层(例如,过滤器大小 (4, 4)
和子采样 (4, 4)
)。这可能被认为是智能池化。这种方法的一个主要缺点是这种方法需要额外的参数。
我正在从作为 Keras 应用程序包含的 VGG16 模型中提取较低级别的功能。这些特征作为附加分类器的预训练输入数据的单独输出导出。概念上的想法是从 Multi-scale recognition with DAG-CNNs
借来的使用没有分类器 top 的模型,使用 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
您提到的内存错误来自于将一个巨大的数组展平,这使得单元数非常大。您实际需要做的是以一种聪明的方式对您的输入进行下采样。我将向您介绍如何执行此操作的一些方法:
MaxPooling
:通过简单地使用池化——你可以先对你的特征图进行下采样,然后Flatten
它们。这种方法的主要优点是它的简单性和不需要额外的参数。主要缺点:这可能是一个非常粗糙的方法。- 智能下采样:在这里您可以添加一个
Convolutional2D
具有大量子采样的层(例如,过滤器大小(4, 4)
和子采样(4, 4)
)。这可能被认为是智能池化。这种方法的一个主要缺点是这种方法需要额外的参数。