我有一个由40个数组组成的数组,具有12个双重特征,因此类型为[[double]]。目前,我正在将此数据发送到Google Cloud ML API以获得相关的预测。
自从苹果公司最近推出CoreML和coremltools以来,我就将模型从keras转换为.mlmodel,从而避免了数千次Google Cloud api调用,并直接在我的iPhone上进行了推断:
coreml_model = coremltools.converters.keras.convert(new_Model, input_names=['accelerations'],
output_names=['scores'])
coreml_model.save('PredictionModel.mlmodel')
将模型添加到我的Xcode项目后,它看起来像:
我不知道这些其他输入和输出来自何处。
为了获得预测,我需要将12个 double 数组的Array转换为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中找到。
最佳答案
我通过阅读此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")
}
关于swift - 如何在CoreML中初始化MLMultiArray,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44460532/