我正在尝试使用Places205 - GoogLeNet制作核心ML模型,如Apple here所述。
我不想使用Apple的现成模型,所以我从这个链接获得了原始模型:https://developer.apple.com/machine-learning/model-details/Places205-GoogLeNet.txt
根据Apple的WWDC会话,我们可以使用Coremltools转换该模型。在他们的会话中,我们不知道他们使用哪个IDE进行Python编码,但目前我正在使用Pycharm进行Python编码。
使用模型的链接,我们可以得到两件事.caffemodel和.prototext。我尝试使用coremltools转换它们并收到以下错误:
RuntimeError: Unable to infer input name and dimensions. Please provide a .prototxt file with 'Input' layer and dimensions defined.
因此,如果Apple的模型没有转换,那么我们怎么说其他开源模型会起作用呢?
您可以在附加的屏幕截图中看到我的代码库。
如何修复此错误?
答案 0 :(得分:5)
看起来Matthijs上面的评论解决了你的核心问题,但我可以为未来与其他模特遇到此问题的人进行扩展。
使用Apple的coremltools将Caffe模型转换为.mlmodel文件时,Apple的转换器同时包含二进制.caffemodel(包含模型结构和权重),以及基于文本的.prototxt模型描述(可能比.caffemodel有更多的上下文)。
通常,经过培训的Caffe模型会有几个不同的.prototxt文件(deploy.prototxt
,solver.prototxt
,train.prototxt
),您通常希望使用{{1} (或类似名称的原型)。
即使你这样做,你仍然可能会遇到关于coremltools的错误,而且#34;无法推断输入名称和尺寸"。 Caffe模型没有明确要求说明模型将接受的输入维度,因此coremltools试图从几个不同的来源推断出。如果缺少这些来源,您可能需要自己将它们编辑到.prototxt中。
在上面链接的deploy.prototxt
中,此输入大小由文件顶部的以下代码指定:
deploy_places205.protxt
但您也可以在其中一个.prototxt说明中看到以下内容:
input: "data"
input_dim: 10
input_dim: 3
input_dim: 224
input_dim: 224
如果您的输入中缺少.prototxt文件,则可以在文件中的第一个input: "data"
input_shape {
dim: 1
dim: 3
dim: 227
dim: 227
}
实例之前添加上述任一项。尺寸依次为:批量大小(Core ML忽略),颜色通道,图像宽度,图像高度。您可以调整这些以匹配网络所需的内容。
您可能还需要验证"数据"是模型使用的输入图层,因此请查找第一个layer {
实例并检查其中是否显示layer {
。如果图层名称不同,您可能需要在那里或在数据层名称中进行更改。
您可能还需要在coremltools转换器中设置数据层名称,以确保它选择正确的名称。作为参考,这里是我用来转换这样的模型的小Python脚本:
bottom: "data"