Python 将Caffe CNN转换为特征提取程序

Python 将Caffe CNN转换为特征提取程序,python,deep-learning,caffe,Python,Deep Learning,Caffe,我必须使用CNN模型从图像中提取特征。我用的是一个训练有素的模型,叫卡夫内特 在Caffe上,通过CNN模型运行图像后,很容易提取特征。例如,如果我希望通过“conv5”层提取特征,我只需调用以下方法: features = net.blobs['conv5'].data[0, : , : , :] 然而,棘手的部分是我需要使用第三方转换工具来转换模型,以便它可以在我的移动设备上运行。转换模型后,我无法访问模型内部层的输出。我只得到最终输出,在本例中是分类,它们不是我需要的 为了从“conv5

我必须使用CNN模型从图像中提取特征。我用的是一个训练有素的模型,叫卡夫内特

在Caffe上,通过CNN模型运行图像后,很容易提取特征。例如,如果我希望通过“conv5”层提取特征,我只需调用以下方法:

features = net.blobs['conv5'].data[0, : , : , :]
然而,棘手的部分是我需要使用第三方转换工具来转换模型,以便它可以在我的移动设备上运行。转换模型后,我无法访问模型内部层的输出。我只得到最终输出,在本例中是分类,它们不是我需要的

为了从“conv5”层(最后一个卷积层)直接获得模型输出特性,我进入了
deploy.prototxt
文件,删除了“conv5”层之后的所有层,因此“conv5”实际上成为了最后一个输出层。但是,在这样做之后,我得到的特征值与我更改prototxt文件之前得到的特征值完全不同

我的怀疑是,即使我通过删除
deploy.prototxt
中的层来更改体系结构,我也无法更改
caffenet.caffemodel
文件中的权重。我不知道为什么这会成为一个问题,因为在“conv5”之后的层的权重将不会被使用。我不知道为什么这会改变“conv5”的输出


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

一个原因可能是“conv5”层之后的某些层将更新或更改conv5的顶部斑点。这些层包括relu层或batch_norm层,因为这些层通常使用就地操作。因此,您最好检查deploy prototxt,并在conv5之后保持batch_norm和relu layers不变。

很难回答这样的问题,因为当您将模型移植到mobile时,不清楚您的模型正在进行什么“转换”。一般来说,从
deploy.prototxt
中删除顶层不应影响前面层的功能值。因此,您的
conv5
功能应该保持不变。在这种情况下,通常怀疑的是输入变换:移植的模型是否会以与原始模型完全相同的方式减去平均值并缩放像素?您是否使用ported mobile模型得到完全相同的类预测(概率)?看,顺便说一句,您的模型中有
BathNorm
层吗?我保留了relu层,现在输出正确!