【问题标题】:How to initialize a MLMultiArray in CoreML如何在 CoreML 中初始化 MLMultiArray
【发布时间】:2017-11-11 15:12:01
【问题描述】:

我有一个包含 40 个数组和 12 个双重特征的数组,所以类型是 [[double]]。目前我正在将此数据发送到 Google Cloud ML API 以获取相关预测。

由于 Apple 最近推出了 CoreML 和 coremltools,我将我的模型从 keras 转换为 .mlmodel 以避免数千次谷歌云 api 调用并直接在我的 iPhone 上进行推理:

coreml_model = coremltools.converters.keras.convert(new_Model, input_names=['accelerations'],
                                                    output_names=['scores'])
coreml_model.save('PredictionModel.mlmodel')

将模型添加到我的 Xcode 项目后,它看起来像:

我不知道这些其他输入和输出是从哪里来的。 为了得到预测,我需要将我的 12 个双精度数组转换为 MLMultiArray,但我不知道该怎么做。有没有人遇到过类似的问题?这是我目前未完成的方法:

_predictionModel = PredictionModel()
guard let mlMultiArray = try? MLMultiArray(dataPointer: <#T##UnsafeMutableRawPointer#>, shape: <#T##[NSNumber]#>, dataType: <#T##MLMultiArrayDataType#>, strides: <#T##[NSNumber]#>, deallocator: <#T##((UnsafeMutableRawPointer) -> Void)?##((UnsafeMutableRawPointer) -> Void)?##(UnsafeMutableRawPointer) -> Void#>) else {
        fatalError("Unexpected runtime error.")
    }
guard let predictionOutput = try? _predictionModel.prediction(accelerations: mlMultiArray, lstm_1_h_in: nil, lstm_1_c_in: nil, lstm_2_h_in: nil, lstm_2_c_in: nil) else {
        fatalError("Unexpected runtime error.")
    }

相关文档可以在here找到。

【问题讨论】:

    标签: swift ios11 xcode9-beta coreml xcode9


    【解决方案1】:

    我通过阅读这个blog 实现了它:)

    let data = _currentScaledMotionArrays.reduce([], +) //result is of type [Double] with 480 elements
    guard let mlMultiArray = try? MLMultiArray(shape:[40,12], dataType:MLMultiArrayDataType.double) else {
        fatalError("Unexpected runtime error. MLMultiArray")
    }
    for (index, element) in data.enumerated() {
        mlMultiArray[index] = NSNumber(floatLiteral: element)
    }
    let input = PredictionModelInput(accelerations: mlMultiArray)
    guard let predictionOutput = try? _predictionModel.prediction(input: input) else {
            fatalError("Unexpected runtime error. model.prediction")
    }
    

    【讨论】:

    • 我遇到了同样的问题,但我不知道如何开始,我的输入数据是图像。因此,如果有人如何做到这一点,将会非常有帮助。
    • 这个example 可能有帮助吗?
    【解决方案2】:

    我就是这样做的。可能不是处理选项的最佳方式,但可以完成测试工作

    使用形状和数据类型创建MLMultiArray 对象的实例

    let mlArray = try? MLMultiArray(shape: [3], dataType: MLMultiArrayDataType.float32)
    

    mlArray 没有附加功能,因此您实际上必须遍历它并添加值

    for i in 0..<array.count {
         mlArray?[i] = NSNumber(value: input[i])
    }
    

    功能齐全

        func convertToMLArray(_ input: [Int]) -> MLMultiArray {
    
            let mlArray = try? MLMultiArray(shape: [3], dataType: MLMultiArrayDataType.float32)
    
    
            for i in 0..<array.count {
                mlArray?[i] = NSNumber(value: input[i])
            }
    
    
            return arr!
        }
    

    【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2018-05-29
    • 2022-01-23
    • 2020-06-26
    • 2015-09-19
    • 1970-01-01
    • 2020-09-03
    • 2021-01-19
    • 2021-03-23
    相关资源
    最近更新 更多