![](/img/trans.png)
[英]How to create CoreML MLMultiArray for a 4D data for prediction on iOS with Swift?
[英]Save CoreML model Prediction MLMultiArray to Core Data
由于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.