【发布时间】:2018-03-23 09:47:27
【问题描述】:
我必须使用 CNN 模型从图像中提取特征。我正在使用一个名为 Caffenet 的训练有素的模型。
在 Caffe 上,通过 CNN 模型运行图像后,很容易提取特征。例如,如果我想要“conv5”层提取的特征,我只需调用方法:
features = net.blobs['conv5'].data[0, : , : , :]
但是,棘手的部分是我需要使用 3rd 方转换工具来转换模型,以便它可以在我的移动设备上运行。转换模型后,我无法访问模型内层的输出。我只得到最终输出,在这种情况下是分类,它们不是我需要的。
为了让模型直接从“conv5”层输出特征,也就是最终的卷积层,我进入deploy.prototxt文件,删除了“conv5”层之后的所有层,所以“conv5”实际上变成了最终输出层。但是,这样做之后,我得到的特征值与我更改prototxt文件之前得到的特征值完全不同。
我怀疑即使我通过删除deploy.prototxt 中的层来更改架构,我也无法更改caffenet.caffemodel 文件中的权重。我不确定为什么这会是一个问题,因为“conv5”之后的层权重不会被使用。我不确定为什么这会改变“conv5”的输出。
如何将经过训练的模型更改为直接从最终卷积层输出特征?
【问题讨论】:
-
很难回答这样的问题,因为当您将模型移植到移动设备时,不清楚您的模型正在经历什么“转换”。一般来说,从
deploy.prototxt中移除顶层应该不会影响前面层的特征值。因此,您的conv5功能应该保持不变。在这种情况下,通常怀疑是输入转换:您的移植模型是否以与原始模型相同的方式精确减去均值和缩放像素?您是否使用移植的移动模型完全获得相同的类别预测(概率)? -
顺便说一句,你的模型中有
BathNorm层吗?
标签: python deep-learning caffe