向 MLMultiArray 添加元素

Posted

技术标签:

【中文标题】向 MLMultiArray 添加元素【英文标题】:Adding elements to a MLMultiArray 【发布时间】:2020-04-20 18:57:05 【问题描述】:

我有一个 CoreML 模型(使用 TF 创建并转换为 CoreML)。为它

input is: MultiArray (Double 1 x 40 x 3)
output is: MultiArray (Double)

我将获得这些 [a,b,c] 元组,需要收集其中的 40 个,然后再发送到模型进行预测。我正在查看 MLMultiArray 文档并被卡住了。可能是因为我是 Swift 的新手。

我有一个名为 modelInput 的变量,我想初始化它,然后当元组进入时,将它们添加到 modelInput 变量中。

modelInput = MLMultiArray(shape:[1,40,3], dataType:MLMultiArrayDataType.double))

调用后,modelInput.count 为 120。所以我猜测创建了一个空数组。

但是现在我想在元组进入时添加它们。我不知道该怎么做。 为此,我有一个 currCount 变量,每次调用后都会更新。但是,以下代码给了我一个错误。

"Value of type 'UnsafeMutableRawPointer' has no subscripts"

    var currPtr : UnsafeMutableRawPointer = modelInput.dataPointer + currCount
    currPtr[0] = a
    currPtr[1] = b
    currPtr[2] = c
    currCount = currCount + 3

如何更新 multiArray?

我的方法是否正确?这是为预测输入创建多数组的正确方法吗?

我还想打印 MLMultiArray 的内容。不过,似乎没有任何辅助函数可以做到这一点。

【问题讨论】:

【参考方案1】:

可以使用指针,但您必须将原始指针更改为类型化指针。例如:

let ptr = UnsafeMutablePointer<Float>(OpaquePointer(multiArray.dataPointer))
ptr[0] = a
ptr[1] = b
ptr[2] = c

【讨论】:

嗨,马蒂斯。我有一个使用 JSON 文件加载到我的应用程序中的 FP 32 值数组。数组的形状是 [1, 12, 128, 192]。然后我创建了一个 MLMultiArray 如下:let data = try? MLMultiArray(shape: [1, 12, 128, 192], dataType: .int32) 那么,我现在如何将数据放入这个 MLMultiarray 呢?您能否提供一个代码示例或指出我正确的方向?顺便说一句,喜欢你的 CoreML 书。谢谢 由于数据在数组中的顺序已经正确,只是数据类型不同。所以你可以简单地做一个for循环来遍历数组中的元素,将它们转换为Int32并将其放入MLMultiArray中。 您好 Matthijs,感谢您的提示。我试过这段代码:let yHat = try? MLMultiArray(shape: [1, 12, 128, 192], dataType: .float32) for i in 0.. 【参考方案2】:

我想通了。我必须这样做——

    modelInput[currCount+0] = NSNumber(floatLiteral: a)
    modelInput[currCount+1] = NSNumber(floatLiteral: b)
    modelInput[currCount+2] = NSNumber(floatLiteral: c)

我不能使用原始指针来访问元素。

【讨论】:

以上是关于向 MLMultiArray 添加元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CoreML 中访问 MLMultiArray 中的元素

c#如何向一个集合中添加元素

向js数组中添加元素的3种方法

jquery 向DIV动态添加元素

jquery向元素里添加元素的问题

C#数组如何添加元素