繁体   English   中英

将 CoreML 模型 Prediction MLMultiArray 保存到 Core Data

[英]Save CoreML model Prediction MLMultiArray to Core Data

我想保存从 CoreML 模型生成的MLMultiArray输出,使其成为持久存储数据。


let predictions = try model.prediction(from: input)

predictions如下,如您所见,它是一个MultiArray(Float32)类型的数据。 在此处输入图像描述

但是,在 Core Data 中,它不支持这种类型。 我注意到有一个名为Transformable的类型,但我不知道它是否可行。

在此处输入图像描述

所以我想知道是否有一种可行的方法来持久化这种数据?

由于MTLMultiArray符合NSSecureCoding ,我能够使用NSKeyedArchiver将其编码为Data ,并使用NSKeyedUnarchiver进行解码。 然后可以将生成的Data实例存储在 Core Data 中,或者您可能希望存储它的其他方式。

因为我没有你的模型,所以我只是明确地创建了一个MLMultiArray实例,并设置了一些值。

let predictions: MLMultiArray = try! .init(shape: [5, 5], dataType: .float32)

let p = predictions.dataPointer.bindMemory(to: Float32.self, capacity: 25)
for i in 0..<25 {
    p[i] = Float32(i)
}

我将编码/解码代码放在函数中,并使它们通用,以防其他类型需要它:

import Foundation

func encode<T: NSSecureCoding>(_ value: T, secure: Bool = false) -> Data?
{
    let archiver = NSKeyedArchiver(requiringSecureCoding: secure)
    predictions.encode(with: archiver)
    archiver.finishEncoding()
    return archiver.encodedData
}

func decode<T: NSSecureCoding>(_ data: Data, as type: T.Type) -> T?
{
    guard let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data) else {
        return nil
    }
    
    return T.init(coder: unarchiver)
}

然后使用它:

guard let data = encode(predictions) else {
    fatalError("Encode failed")
}

// You can now save data to Core Data, or however else you want to persist it

guard let recoveredPredictions = decode(data, as: MLMultiArray.self) else {
    fatalError("Decode failed")
}

我还写了一些代码来测试它是否有效:

print(" original predictions: \(predictions)")
print("recovered predictions: \(recoveredPredictions)")

let r = recoveredPredictions.dataPointer
    .bindMemory(to: Float32.self, capacity: 25)
for i in 0..<25
{
    guard p[i] == r[i] else {
        fatalError("recoveredPredictions does not match predictions")
    }
}

print("Success")

输出是

 original predictions: Float32 5 × 5 matrix
[0,1,2,3,4;
 5,6,7,8,9;
 10,11,12,13,14;
 15,16,17,18,19;
 20,21,22,23,24]
recovered predictions: Float32 5 × 5 matrix
[0,1,2,3,4;
 5,6,7,8,9;
 10,11,12,13,14;
 15,16,17,18,19;
 20,21,22,23,24]
Success

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM