Keras 获取 VGG 中特定图像最后一层的特征图

Keras get feature map of last layer for a specific image in VGG

我有几张图片。我想使用 VGG 为每个获取 4096 的一维特征图,类似于此处所做的: (他们有 700 张图像作为输入。他们从 VGG16 中删除了最后一个全连接层,因此,VGGNet 包括 13 个卷积层(Conv)、5 个最大池化层和 2 个全连接层 层 (Fc),生成一个 700 × 4096 的特征图作为其输出)

最好的方法是什么? (请注意,我只需要 PS 的上半部分 - 为每个图像生成一个 1X4096 向量。连接目前并不重要)

考虑到以下限制,这应该足够了:

  • 您的网络不是完全卷积的,您将无法更改输入大小。
  • 您的网络可能对一些空间信息进行了编码(因为您正在将网格转换为展平矢量)。

这并不是说这个概念是错误的还是不正确的。例如,在某些情况下,对位置进行编码很重要。在其他一些地方,使用不同大小的图像很有趣,例如在多个尺度和平均结果下进行推断。

要在 Keras 中执行此操作,您只需要原始的 VGG 模型。您可以创建新的:

model_base = tf.keras.applications.VGG16(
    include_top=True,
    weights="imagenet",
    input_tensor=None,
    input_shape=None,
    pooling=None,
    classes=1000,
    classifier_activation="softmax",
)

new_input = model_base.input
new_output = model_base.get_layer('fc2').output
model = tf.keras.Model(new_input, new_output)

这是一种非常普遍的提取特征的方式,根据你的兴趣你可以保留或不保留FC。比如你分析keras原代码:https://github.com/keras-team/keras-applications/blob/master/keras_applications/vgg16.py,你会发现如果你指明include_top=False,FC部分会被去掉(称为分类),只有特征提取部分+ 将保留全局平均池。

更新:

VGG 不编码空间输入吗? 是否有其他 pre-trained 网络在维护它?

  1. VGG 与 fully-connected YES 一起在分类层中编码空间信息。这意味着最后一层,例如,如果预测取决于检测上方的天空,它是可以预期的。可能发生在你身上的相反情况是,如果你想将左上角有一只猫的大图像分类为猫,而你只用右边的猫图像进行训练,那么你可能会遇到空间信息问题。但是,还有其他方法可以对空间信息进行编码。 fully-convolutional 网络的最大好处是您可以使用不同尺寸的图像。 这取决于问题,目前 fully-convolutional 网络使用很多,这意味着没有从网格到扁平向量的转换。否则整个图像被平均,因此空间信息丢失。这是现在的标准。

include_top = False 对生成的特征图有什么影响?

  1. 如果它会影响,include_top = True,您将保留所有 fully-connected 层,然后保留 fc2 (https://neurohive.io/wp-content/uploads/2018/11/vgg16.png)。如果你设置 include_top = False,你将移除 FC 并放置一层全局平均池化,它将对所有特征进行平均。

最好的解决方案是什么?没有更好的解决方案,这取决于你的问题,通常不是那么重要。