我必须使用CNN模型从图像中提取特征。我正在使用称为Caffenet的训练模型。
在Caffe上,通过CNN模型运行图像后,很容易提取特征。例如,如果我希望通过“ conv5”层提取要素,则只需调用该方法:
features = net.blobs['conv5'].data[0, : , : , :]
但是,棘手的部分是我需要使用第三方转换工具来转换模型,以便它可以在我的移动设备上运行。转换模型后,我无法访问模型内部各层的输出。我只得到最终输出,在这种情况下是分类,它们不是我所需要的。
为了直接从最终的卷积层“ conv5”层获得模型的输出特征,我进入了
deploy.prototxt
文件并删除了“ conv5”层之后的所有层,因此“ conv5”有效地成为了最终的输出层。但是,这样做之后,我获得的特征值与更改prototxt文件之前获得的特征值完全不同。我的怀疑是,即使我通过删除
deploy.prototxt
中的图层来更改体系结构,也无法更改caffenet.caffemodel
文件中的权重。我不确定为什么会出现问题,因为将不会使用“ conv5”之后的图层权重。我不确定为什么这会更改“ conv5”的输出。如何更改训练后的模型以直接从最终卷积层输出要素?
最佳答案
一个原因可能是“ conv5”层之后的某些层将更新或更改conv5的顶部Blob。这些层包括relu层或batch_norm层,因为这些层通常使用就地操作。因此,最好在conv5之后检查部署原型,并保持batch_norm和relu层不变。
关于python - 将Caffe CNN转换为特征提取器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49377891/