导出到CoreML的Keras模型中的神秘“输入功能的不同批号”错误

时间:2018-07-11 19:44:25

标签: swift xcode error-handling keras coreml

我在导出到CoreML的Keras模型中遇到了一个错误,但我无法弄清楚它的来源或原因。我正在使用Xcode 9 + MacOS 10.13.5 High Sierra + Keras 2.1.5。我无法确定CoreML版本。

该模型是在Keras中创建并导出到CoreML的LSTM(“长期短期记忆”)模型。我已成功将模型链接到我的iOS应用程序。但是,当我运行该应用程序时,尝试从LSTM生成预测时出现以下错误。

2018-07-11 11:47:30.159116-0700 mymlmodelapp[32544:191635] [coreml] Different batch numbers for input features.
2018-07-11 11:47:30.159409-0700 mymlmodelapp[32544:191635] [coreml] Failure in resetSizes.

我现在真的很茫然。我无法弄清楚错误的来源。我试图在Xcode中设置一个断点以打破Swift错误,但未触发该断点。我可以通过在捕获错误的位置设置断点来检查错误实例,但是我看不到如何获取引发错误的点的堆栈跟踪。

我在CoreML,Keraas或Tensorflow中找不到有关它的任何文档。我也无法在Keras或Tensorflow源代码或CoreML库中找到该字符串(仅二进制文件,我找不到源代码,如果您知道如何获取它,我会很感兴趣) 。

所以在某种程度上,这是关于CoreML + Keras的,但这也只是关于如何在Xcode中找出错误来源的一个普遍问题。

这是有问题的代码。 Foo_Bar是在Keras中分配的输入的名称。目的是将文本字段解析为作为输入的值,然后将输入提供给LSTM,获取输出,然后将输出粘贴到另一个文本字段中。

@IBAction func mybuttonAction(_ sender: Any) {
    let s: String? = myinput.text
    if (s != nil && s!.count > 0) {
        guard let input_data = try? MLMultiArray(shape:[1, 4, 2], dataType:.double) else {
            fatalError("Unexpected runtime error. MLMultiArray")
        }

        let w = s!.split(separator: " ")
        let x = w.map { s1 in Double(s1) }

        var x8 = [Double](repeating: 0.0, count: 8)
        for i in 0..<(x.count > 8 ? 8 : x.count) {
            if x[i] != nil {
                x8[i] = x[i]!
            }
        }
        for i in 0..<8 {
            input_data[i] = NSNumber(value: x8[i])
        }

        let mymodel = myLSTM_regressionModel_sos06252018 ()
        do {
            let lstm_input = myLSTM_regressionModel_sos06252018Input (Foo_Bar: input_data)
            let output_data = try mymodel.prediction (input: lstm_input)
            let y = output_data.featureValue (for: "Predictions")
            let z = y?.multiArrayValue
            myoutput.text = String(z!.count)
        }
        catch {
            myoutput.text = "OOPS: \(error)"
        }

    }
}

编辑2018-07-27:我发现该示例通过将shape:[1, 4, 2]更改为shape:[4, 1, 2]而起作用。这对我来说没有任何意义,但是正如他们所说,对成功没有争议。我尝试了其他几种失败的排列。

0 个答案:

没有答案