将 Caffe CNN 转换为特征提取器

Convert Caffe CNN to Feature Extractor

我必须使用 CNN 模型从图像中提取特征。我正在使用一个名为 Caffenet 的训练模型。

在Caffe上,运行通过CNN模型对图像进行特征提取后,非常容易。例如,如果我想要"conv5"层提取的特征,我只需调用方法:

features = net.blobs['conv5'].data[0, : , : , :]

然而,棘手的部分是我需要使用第 3 方转换工具来转换模型,以便它可以 运行 在我的移动设备上。转换模型后,我无法访问模型内​​层的输出。我只得到最终输出,在这种情况下是分类,它们不是我需要的。

为了让模型直接从 "conv5" 层(最后的卷积层)输出特征,我进入了 deploy.prototxt 文件并删除了 "conv5" 层之后的所有层, 所以 "conv5" 实际上成为了最终的输出层。但是,这样做之后,我得到的特征值与我更改prototxt文件之前得到的特征值完全不同。

我怀疑即使我通过删除 deploy.prototxt 中的层更改了体系结构,我也无法更改 caffenet.caffemodel 文件中的权重。我不确定为什么这会成为一个问题,因为 "conv5" 之后的层的权重将不会被使用。我不确定为什么这会改变 "conv5".

的输出

如何将训练好的模型更改为直接从最终卷积层输出特征?

一个原因可能是 "conv5" 层之后的某些层将更新或更改 conv5 的顶部 blob。这些层包括 relu 层或 batch_norm 层,因为这些层通常使用 in-place 操作。所以你最好检查deploy prototxt,保持batch_norm和conv5之后的relu层不变。