核心ML模型转换失败,“无法推断输入名称和维度”

时间:2017-06-22 11:03:14

标签: python ios machine-learning coreml

我正在尝试使用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的模型没有转换,那么我们怎么说其他开源模型会起作用呢?

您可以在附加的屏幕截图中看到我的代码库。

如何修复此错误?

enter image description here

1 个答案:

答案 0 :(得分:5)

看起来Matthijs上面的评论解决了你的核心问题,但我可以为未来与其他模特遇到此问题的人进行扩展。

使用Apple的coremltools将Caffe模型转换为.mlmodel文件时,Apple的转换器同时包含二进制.caffemodel(包含模型结构和权重),以及基于文本的.prototxt模型描述(可能比.caffemodel有更多的上下文)。

通常,经过培训的Caffe模型会有几个不同的.prototxt文件(deploy.prototxtsolver.prototxttrain.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"