Core ML 模型转换失败 "Unable to infer input name and dimensions"
Core ML model conversion fails with "Unable to infer input name and dimensions"
我正在尝试从 Places205 - GoogLeNet 制作一个 Core ML 模型,如 Apple here 所述。
我不想使用 Apple 的 ready-made 模型,所以我从这个 link 得到了原始模型:https://developer.apple.com/machine-learning/model-details/Places205-GoogLeNet.txt
根据 Apple 的 WWDC session,我们可以使用 Coremltools 转换该模型。在他们的 session 中,我们不知道他们使用哪个 IDE 进行 Python 编码,但目前我正在使用 Pycharm 进行 Python 编码。
对模型使用link,我们可以得到两个东西.caffemodel 和.prototext。我尝试使用 coremltools 转换它们并收到以下错误:
RuntimeError: Unable to infer input name and dimensions. Please provide a .prototxt file with 'Input' layer and dimensions defined.
那么,如果 Apple 的给定模型没有转换,那么我们怎么能说其他开源模型会起作用呢?
您可以在附加的屏幕截图中看到我的代码库。
如何解决这个错误?
看起来 Matthijs 用他上面的评论解决了你的核心问题,但我可以为将来遇到其他模型的人扩展它。
使用 Apple 的 coremltools 将 Caffe 模型转换为 .mlmodel 文件时,Apple 的转换器采用二进制 .caffemodel(包含模型结构和权重)以及基于文本的 .prototxt 模型描述(其中可能比 .caffemodel 有更多的上下文)。
通常,经过训练的 Caffe 模型会有几个不同的 .prototxt 文件(deploy.prototxt
、solver.prototxt
、train.prototxt
),您通常希望使用 deploy.prototxt
(或类似命名的 prototxt)。
即使这样做,您仍然可能会遇到关于 coremltools 的错误 "Unable to infer input name and dimensions"。 Caffe 模型没有明确要求说明模型将接受的输入维度,因此 coremltools 尝试从几个不同的来源推断这一点。如果缺少这些源,您可能需要自己将它们编辑到 .prototxt 中。
在上面的链接 deploy_places205.protxt
中,此输入大小由文件顶部的以下代码指定:
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
}
如果您的 .prototxt 文件缺少此输入,您可以在文件中的第一个 layer {
实例之前添加上述任一内容。维度依次为:批量大小(被 Core ML 忽略)、颜色通道、图像宽度、图像高度。您可以调整这些以匹配网络的预期。
您可能还需要验证 "data" 是模型使用的输入层,因此查找第一个 layer {
实例并检查其中是否显示 bottom: "data"
。如果层名称有所不同,您可能需要在此处或在数据层名称中进行更改。
您可能还需要在 coremltools 转换器中设置数据层名称,以确保它选择正确的名称。作为参考,这是我用来转换模型的小 Python 脚本:
import coremltools
coreml_model = coremltools.converters.caffe.convert(('mymodel.caffemodel', 'deploy.prototxt'),
image_input_names = "data",
is_bgr = True,
class_labels='labels.txt'
)
coreml_model.save('MyModel.mlmodel')
我正在尝试从 Places205 - GoogLeNet 制作一个 Core ML 模型,如 Apple here 所述。
我不想使用 Apple 的 ready-made 模型,所以我从这个 link 得到了原始模型:https://developer.apple.com/machine-learning/model-details/Places205-GoogLeNet.txt
根据 Apple 的 WWDC session,我们可以使用 Coremltools 转换该模型。在他们的 session 中,我们不知道他们使用哪个 IDE 进行 Python 编码,但目前我正在使用 Pycharm 进行 Python 编码。
对模型使用link,我们可以得到两个东西.caffemodel 和.prototext。我尝试使用 coremltools 转换它们并收到以下错误:
RuntimeError: Unable to infer input name and dimensions. Please provide a .prototxt file with 'Input' layer and dimensions defined.
那么,如果 Apple 的给定模型没有转换,那么我们怎么能说其他开源模型会起作用呢?
您可以在附加的屏幕截图中看到我的代码库。
如何解决这个错误?
看起来 Matthijs 用他上面的评论解决了你的核心问题,但我可以为将来遇到其他模型的人扩展它。
使用 Apple 的 coremltools 将 Caffe 模型转换为 .mlmodel 文件时,Apple 的转换器采用二进制 .caffemodel(包含模型结构和权重)以及基于文本的 .prototxt 模型描述(其中可能比 .caffemodel 有更多的上下文)。
通常,经过训练的 Caffe 模型会有几个不同的 .prototxt 文件(deploy.prototxt
、solver.prototxt
、train.prototxt
),您通常希望使用 deploy.prototxt
(或类似命名的 prototxt)。
即使这样做,您仍然可能会遇到关于 coremltools 的错误 "Unable to infer input name and dimensions"。 Caffe 模型没有明确要求说明模型将接受的输入维度,因此 coremltools 尝试从几个不同的来源推断这一点。如果缺少这些源,您可能需要自己将它们编辑到 .prototxt 中。
在上面的链接 deploy_places205.protxt
中,此输入大小由文件顶部的以下代码指定:
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
}
如果您的 .prototxt 文件缺少此输入,您可以在文件中的第一个 layer {
实例之前添加上述任一内容。维度依次为:批量大小(被 Core ML 忽略)、颜色通道、图像宽度、图像高度。您可以调整这些以匹配网络的预期。
您可能还需要验证 "data" 是模型使用的输入层,因此查找第一个 layer {
实例并检查其中是否显示 bottom: "data"
。如果层名称有所不同,您可能需要在此处或在数据层名称中进行更改。
您可能还需要在 coremltools 转换器中设置数据层名称,以确保它选择正确的名称。作为参考,这是我用来转换模型的小 Python 脚本:
import coremltools
coreml_model = coremltools.converters.caffe.convert(('mymodel.caffemodel', 'deploy.prototxt'),
image_input_names = "data",
is_bgr = True,
class_labels='labels.txt'
)
coreml_model.save('MyModel.mlmodel')