当用作预训练特征提取器时,VGG16 应该提取多少特征?

Posted

技术标签:

【中文标题】当用作预训练特征提取器时,VGG16 应该提取多少特征?【英文标题】:How many features is VGG16 supposed to extract when used as a pre-trained feature extractor? 【发布时间】:2019-11-14 12:16:23 【问题描述】:

我正在使用带有 TensorFlow 后端的 Keras,通过预训练模型(ImageNet 上的 VGG16)从图像中提取特征。从我可以在线阅读的内容来看,我应该为每张图像获取一个具有 4096 个特征的向量。

我正在使用这条线来导入没有最后一个全连接层的模型(我相信我应该这样做):

applications.vgg16.VGG16(weights='imagenet', include_top=False, pooling='avg'

但是,我最终得到的向量只有 512 个特征。考虑 VGG16 的架构:

看起来我实际上是从最后一个最大池化层获得结果(这与 Keras 文档一致)。

那么我应该获得 512 或 4096 个特征吗?

【问题讨论】:

【参考方案1】:

根据Keras documentation,当您设置include_top = False 时,它会直观地忽略最后 3 个全连接(FC)层,您应该得到一个正确的 512 特征向量。如果您想考虑最后 3 个 FC 层,请设置 include_top = True。然后你会得到一个 1000 个特征预测(考虑到最后的 softmax 层)。

尝试执行:

vggmodel = keras.applications.vgg16.VGG16(weights='imagenet', include_top=False, pooling='avg')
vggmodel.summary()

vggmodel = keras.applications.vgg16.VGG16(weights='imagenet', include_top=True, pooling='avg') 
vggmodel.summary()

以获得更全面的了解。

【讨论】:

以上是关于当用作预训练特征提取器时,VGG16 应该提取多少特征?的主要内容,如果未能解决你的问题,请参考以下文章

如何取出预训练的 keras 模型的中间层

Keras VGG 提取特征

使用 VGG 16 作为特征提取器的 U-net 类架构 - 连接层的问题

使用预训练 (Tensorflow) CNN 提取特征

Opencv+TF-Slim实现图像分类及深度特征提取

预测时是不是可以从预训练的 vgg 模型中获得第 1 层和第 5 层输出? [复制]