如何为 4D 数据创建 CoreML MLMultiArray 以预测 iOS 和 Swift?

How to create CoreML MLMultiArray for a 4D data for prediction on iOS with Swift?

我有一个用 Keras 训练的模型,它需要 4D 输入,N 是样本数,每个样本都是形状为 (9,15,1) 的 3D 数据,它们不是图像。 我使用 CoreML Converter 转换了 Keras 模型并将模型导入 xcode,如下所示

我有一个代表我的数据的 4D Float 数组,但我很难将其输入我的模型以使用它进行预测。

模型需要一个 MLMultiArray,根据我的尝试,我既不能将我的 4D 浮点数组转换为 MLMultiArray,也不能从头开始创建它。

假设我有“数据”,它是 Float

的 4D 数组
let data = [[[[Float]]]]()
let arr = try? MLMultiArray(data)  

这给了我

Initializer 'init(_:)' requires that '[[[[Float]]]]' conform to 'FixedWidthInteger'

我在 https://itnext.io/train-your-own-ml-model-using-scikit-and-use-in-ios-app-with-coreml-and-probably-with-augmented-99928a3757ad 找到了另一篇文章 显示如何为二维数组构建 MLMultiArray,效果很好,因为您知道第一维是样本数,因此您确实需要将第二维值添加为 NSNumber。 但这无助于解释如何处理数据的第 3 维或第 4 维。

我仍然尝试使用该方法在 MLMultiArray 中一个一个地设置每个 3D 样本

var arr = try? MLMultiArray(shape: [NSNumber(value:9), NSNumber(value:15), NSNumber(value:1)], dataType: MLMultiArrayDataType.float32)

for (ind,sample) in data.enumerated() {
    let arr = try? MLMultiArray(sample)
    arr?[ind] = arr
}

当我 运行 那个时,我得到以下错误...

Cannot assign value of type 'MLMultiArray?' to type 'NSNumber'.

所以即使它是 4D,它也需要一个 NSNumber ?? 从 4D 浮点数据创建 MLMultiArray 以输入到 CoreML 模型的正确方法是什么?

如果您要使用 Float 数组来初始化 MLMultiArray,它需要是一维数组。这意味着您需要先将 4D 数据“展平”为 1D 数组。

(这就是为什么 MLMultiArray 有一个 strides 属性。你需要使用这些步幅来计算每个元素在展平数组中的位置。)