machine-learning - Keras VGG16 低层特征提取

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

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

使用没有分类器顶部的模型,使用Flatten()从block_5拉动层提取最高级别​​的特征: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

最佳答案

您提到的内存错误来自于展平一个巨大的数组,这使得单元的数量变得非常大。您实际需要做的是以智能方式对输入进行下采样。我将向您介绍如何执行此操作的一些方法:

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

关于machine-learning - Keras VGG16 低层特征提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655466/

相关文章:

machine-learning - 是否可以使用具有编译设置 USE_CUDNN := 1? 的 CPP 代码

machine-learning - Keras 和输入层

javascript - tensorflow.js model.predict() 打印张量 [[NaN],]

python - 用于图像预测的 ConvLSTM 模型的输入形状

machine-learning - 使用多层感知器对不平衡数据集进行分类

tensorflow - 如何训练一个简单的神经网络来实现中值滤波器?

python - 如何让 scikit 从预标记文档中计算文档术语矩阵?

python - python cifar-10 unpickle 中的键 "b' batch_label' "有何用途?

python - 与我的 PC 相比,Google Colab 非常慢

neural-network - Pytorch Forward Pass 每次都改变?