我有一个包含12个双重特征的40个数组的数组,因此类型为[[double]]。目前,我将此数据发送到Google Cloud ML API以获得相关预测。
由于Apple最近推出了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')
我不知道,这些其他输入和输出来自何处。 为了得到预测,我需要将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。
答案 0 :(得分:3)
我通过阅读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")
}
答案 1 :(得分:1)
这就是我的方法。可能不是处理可选项的最佳方法,但可以完成测试工作
使用形状和数据类型创建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!
}