从中间层提取CNN特征

时间:2018-03-12 03:48:58

标签: matlab machine-learning computer-vision deep-learning conv-neural-network

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

图层是这样的: Conv1 Relu1 Pool1(3x3,32个功能) - > Conv2 Relu2 Pool2(3x3,64个功能) - > Conv3 Relu3 Pool3(3x3,128个特征) - > Conv4 Relu4(1x1,256个特征) - > Conv5(1x1,4个特征) - > Softwamxloss

训练结束后,我删除了损失层

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

我的网络看起来像那样 enter image description here

我可以提取这样的功能:

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

同样,我删除了2个以上的图层并从Conv4中提取256个特征。 但是当我转移到Conv3时,输出功能是7x7x128。 我想知道我怎样才能使用这些功能 i)制作单个载体 ii)对深度值求平均值?

1 个答案:

答案 0 :(得分:1)

将地图转换为特征向量:

在您的情况下,您可以将7x7x128地图转换为具有6727维度的数组。如果您有一个中间映射,其扁平数组具有高维度(例如,100k-d),您可能希望减小其尺寸(例如,通过PCA),因为它的功能可能包含大量冗余。

组合图层的输出:

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

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

附加功能:

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

[1] "Early versus Late Fusion in Semantic Video Analysis"

[2] "CNN Features off-the-shelf: an Astounding Baseline for Recognition"