【问题标题】:How to correctly add input data to the tflite model in swift?如何快速正确地将输入数据添加到 tflite 模型?
【发布时间】:2021-01-05 16:39:13
【问题描述】:

我的 tflite 模型的输入形状 - (18, 63) 或 1134 个数字。

我在 Objective-C 代码中获取数据本身,然后我将其发送到 swift 代码并且那里已经发生错误。详细我做了以下

  1. 接收 NSMutableArray 中的数据。数组长度为 1134 NSNumber
  2. 将 NSMutableArray 转换为 NSData
   NSData *d = [NSKeyedArchiver archivedDataWithRootObject:_data];
   NSLog(@"output: %@", d);
   // output: {length = 18181, bytes = 0x62706c69 73743030 d4000100 02000300 ... 00000000 000034fd }
  1. 我将数据发送到 swift 代码。
    Swift 代码:
@objc public func predict(_ data: NSData) {
        guard
          let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite")
        else {
            return
        }

        do {
          let interpreter = try Interpreter(modelPath: modelPath)
          try interpreter.allocateTensors()

          let inputData: Data = data as Data

          try interpreter.copy(inputData, toInputAt: 0) // <-- an error occurs in this line

          try interpreter.invoke()
          let outputTensor = try interpreter.output(at: 0)
        } catch {
          print(error)
        }
}
  1. 我在上面的代码行中遇到错误。错误:
    Provided data count 18181 must match the required count 4536.

H

【问题讨论】:

  • 为什么未归档数据的长度是 18181,而你应该有 4536?
  • 不知道为什么,就是一个不知道怎么修复的bug
  • 我看到你将NSMutableArray 转换为NSData。转换后的 data 的长度为 18181 个 bytes(这表示存储在数组中的 1134 个 numbers)。在 swift 方面的某个地方,您需要将数据转换回数组,您必须 unarchive 数据以在 将其传递给模型之前将数组取回。
  • 模型接受NSData/Data格式数据
  • 好的,我没有 tflite 文档,也没有使用它,但是也许您需要将其转换为不同的数据,例如使用属性列表编码?文档应该给出一些如何转换为它期望的NSData 的工作示例?

标签: objective-c swift tensorflow-lite


【解决方案1】:

您似乎转换为 NSData 错误。该代码没有显示您如何构建 _data,但从记录的大小来看,这似乎是问题所在。 请参阅question,了解如何从 NSNumber 对象中提取值并在将其传递给 swift 函数之前执行此操作。

【讨论】:

    【解决方案2】:

    我有同样的问题,这就是我使用的。我从一个 Double 类型的数组开始。

    然后我把它转换成float32:

    guard let inputDataFloat32 = yourArray.compactMap({ d in
        Float32(d)
    }) else { return }
    

    然后在Data()中:

    let inputData = inputDataFloat32.withUnsafeBytes { f in
        Data(f)
    }
    

    你可以得到这样的输出:

    guard let data = outputTensor?.data else {
        return
    }
        
    var output = Array<Float32>(repeating: 0, count: data.count/MemoryLayout<Float32>.stride)
    _ = output.withUnsafeMutableBytes { i in
        data.copyBytes(to: i)
    }
    print("Output: \(output)")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2014-10-20
      • 2015-03-14
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多