当前位置: 首页 > 知识库问答 >
问题:

从中间层提取CNN特征

霍弘厚
2023-03-14

我想使用SVM测试我的卷积神经网络(CNN)架构的每个卷积层的性能。我正在使用MatConvNet Matlab工具箱。

图层如下:Conv1 Relu1 Pool1(3x3,32个功能)-

训练后,我移除了损失层

net.layers=net.layers(1 : end - 1);

我可以提取这样的特征:

feats = vl_simplenn(net, im) ;
Feautre_L1(fea,:) = squeeze(feats(end).x);

类似地,我又删除了2层,并从Conv4中提取了256个特征。但当我转到Conv3时,输出特性是7x7x128。我想知道如何使用这些特性I)生成单个向量ii)深度平均值?

共有1个答案

施誉
2023-03-14

在您的示例中,可以将7x7x128映射转换为6727维的数组。如果您有一个中间贴图,其展平数组具有高维性(例如100k-d),您可能希望降低其维度(例如通过PCA),因为它的特征中可能包含大量冗余。

至于组合特征,有很多方法。您提到的一个选项是创建一个连接所需图层输出的单个向量,并在此基础上训练分类器。这称为早期融合[1],在训练之前将您的特征组合为单个表示。

另一种可能性是为每个特征训练一个单独的分类器(在您的情况下是每个中间层的输出),然后对于测试图像,您将这些单独分类器的输出/分数结合起来。这被称为后期融合[1]。

您可以进行的一项探索是,在训练SVM之前,调查您应该选择哪些层(用于早期融合或晚期融合)。这[2]是一篇有趣的论文,作者们在这篇论文中探索了一些类似的东西(分析了将最后几层的输出分别用作特征时的性能)。据我所知,他们的调查是在迁移学习的背景下进行的(使用在类似问题中预先训练过的模型来处理/解决另一项任务)。

[1] “语义视频分析中的早期与晚期融合”

[2] “美国有线电视新闻网(CNN)现成的特色:令人震惊的识别基线”

 类似资料:
  • 参考这里. Common Layers For a neural network architecture to be considered a CNN, it requires at least one convolution layer (tf.nn.conv2d). There are practical uses for a single layer CNN (edge detection

  • 让我们以whalesay图片为例<代码>docker history显示以下内容: 我想提取显示为的层。有这样做的工具/方法吗?

  • 昨天我学习了卷积神经网络,并使用Tensorflow完成了一些CNN的实现,所有的实现都只指定了过滤器的大小、数量和步长。但当我了解到过滤器时,它说每一层上的过滤器都会提取不同的特征,如边、角等。 我的问题是,我们能否明确指定过滤器,我们应该提取哪些特征,或者图像的哪个部分更重要等等 所有的解释都是说,我们将输入图像的一小部分进行卷积滑动。如果是这样的话,我们是否要获取图像的所有部分并在图像上进行

  • 我有一个JSON如下 有没有什么方法可以直接将“ID”的值提取到变量中,而不需要遍历根元素,即“Root1”。因为每次运行应用程序时根元素名称都会发生变化,比如“Root2”、“Root3”。 下面是我尝试使用“Root1”和“Result”元素提取ID的代码

  • 卷积神经网络中的“局部”层和“密集”层有什么区别?我正在尝试理解TensorFlow中的CIFAR-10代码,我看到它使用“局部”层而不是规则的密集层。TF中是否有支持实现“本地”层的类?

  • 问题内容: 我有一个包含6列的R数据框,并且我想创建一个仅包含三列的新数据框。 假设我的数据帧df,我想提列A,B和E,这是唯一的命令,我可以计算出: 有没有更紧凑的方法可以做到这一点? 问题答案: 如果您的data.frame被调用,则使用dplyr包df1: 也可以在不使用%>%管道的情况下将其写为: