尝试初始化 CoreML 模型会导致模棱两可的错误消息

Posted

技术标签:

【中文标题】尝试初始化 CoreML 模型会导致模棱两可的错误消息【英文标题】:Attempting to initialize CoreML model results in ambiguous error message 【发布时间】:2020-10-25 23:26:21 【问题描述】:

我正在为涉及 CoreML 的 ios 14.0 开发消息过滤器扩展。我正在尝试加载使用 Create ML 生成的 mlmodel (TSF_ML_2 1.mlmodel)。该模型在 Xcode/Create ML 的预览部分中使用时表面上可以工作,但是当以编程方式初始化模型时,我收到以下错误,我找不到任何信息:

使用模型数据初始化文本分类器模型失败

完整的追溯:

2020-07-05 15:51:07.965420-0400 SpamFilter[36466:3635584] [coreml] MLModelAsset: load failed with error Error Domain=com.apple.CoreML Code=0 "initialization of text classifier model with model data failed" UserInfo=NSLocalizedDescription=initialization of text classifier model with model data failed
2020-07-05 15:51:07.967619-0400 SpamFilter[36466:3635584] [coreml] MLModelAsset: modelWithError: load failed with error Error Domain=com.apple.CoreML Code=0 "initialization of text classifier model with model data failed" UserInfo=NSLocalizedDescription=initialization of text classifier model with model data failed
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=com.apple.CoreML Code=0 "initialization of text classifier model with model data failed" UserInfo=NSLocalizedDescription=initialization of text classifier model with model data failed: file /Users/username/Library/Developer/Xcode/DerivedData/SpamApp-fqenpxvawdmzkvdmdxjbatoucwji/Build/Intermediates.noindex/SpamApp.build/Debug-iphoneos/SpamFilter.build/DerivedSources/CoreMLGenerated/TSF_ML_2 1/TSF_ML_2 1.swift, line 63
2020-07-05 15:51:07.970910-0400 SpamFilter[36466:3635584] Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=com.apple.CoreML Code=0 "initialization of text classifier model with model data failed" UserInfo=NSLocalizedDescription=initialization of text classifier model with model data failed: file /Users/username/Library/Developer/Xcode/DerivedData/SpamApp-fqenpxvawdmzkvdmdxjbatoucwji/Build/Intermediates.noindex/SpamApp.build/Debug-iphoneos/SpamFilter.build/DerivedSources/CoreMLGenerated/TSF_ML_2 1/TSF_ML_2 1.swift, line 63
(lldb)

我正在使用 Xcode 12.0 beta (12A6159),并使用与此 Xcode 关联的 Create ML(版本 1.1 Beta (41))生成了 mlmodel。

我尝试过的事情:

使用各种参数和数据重新生成 mlmodel。 (主要是我使用迁移学习) 确认目标正确且 mlmodel 类已正确生成/链接 使用contentsOf 手动指定模型 URL 在设备上而不是在 Xcode 中编译 mlmodelc

这是我在MessageFilterExtension.swift 中的初始化逻辑(中断@ line 1):

let model:TSF_ML_2_1! = TSF_ML_2_1()

guard let spamOutput = try? model.prediction(text: messageBody) else 
    fatalError("Unexpected runtime error.")


print(spamOutput.label)

这里是自动生成的 Swift 模型类的相关部分,TSF_ML_2 1.swift(错误回溯@第 63 行):

52 class TSF_ML_2_1 
53     let model: MLModel
54     class var urlOfModelInThisBundle : URL 
55         let bundle = Bundle(for: self)
56         return bundle.url(forResource: "TSF_ML_2 1", withExtension:"mlmodelc")!
57     
58     init(model: MLModel) 
59         self.model = model
60     
61     @available(*, deprecated, message: "Use init(configuration:) instead and handle errors appropriately.")
62     convenience init() 
63         try! self.init(contentsOf: type(of:self).urlOfModelInThisBundle)
64     
    ...
   

【问题讨论】:

可能是测试版问题。 【参考方案1】:

在定义MLModel 时使用此模型初始化:

var myModel: Resnet50 = try! Resnet50(configuration: MLModelConfiguration.init())

【讨论】:

【参考方案2】:

我还发现代码以这种方式运行没有任何错误。

let myModel: modelName = try! modelName(configuration: MLModelConfiguration.init())

guard let model = try? VNCoreMLModel(for: myModel.model) else fatalError()

【讨论】:

【参考方案3】:

我仍在学习 Swift,但看起来他们希望您同时掌握模型初始化和预测。以下是我将如何编码您的预测:

do 
    let model = try TSF_ML_2_1(configuration: .init())
    let spamOutput = try model.prediction(text: messageBody)
    // successful code
 catch 
    // failure code

这似乎对我有用。

【讨论】:

以上是关于尝试初始化 CoreML 模型会导致模棱两可的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥初始化列表中的元素数量会导致模棱两可的调用错误?

为啥在所有边缘上固定 UIStackView 会导致模棱两可的约束错误?

尝试使用 coremltools 4.1 将模型转换为 coreml 不工作

将模型从 tensorflow 转换为 Coreml (4.0) 时出现实例归一化错误

没有先验层和 softmax 层的 YOLACT onnx 的 xrunc coreml 模型错误

如何创建可更新的 CoreML 模型?