部署到微控制器时出现 TensorFlow Lite 转换错误

问题描述 投票:0回答:1

我使用迁移学习教程创建了一个 Keras 模型。然后,我使用量化和转换器为我的 Arduino nano sense 和 ArduCam 2MP Plus 相机生成字节数组:

with tf.device('/device:GPU:0'):
  repr_ds = ds_rep.unbatch()
  def representative_data_gen():
    for i_value, o_value in repr_ds.batch(1):
      yield [i_value]
  converter = tf.lite.TFLiteConverter.from_saved_model(modelDir_fine)
  converter.optimizations = [tf.lite.Optimize.DEFAULT]
  converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
  converter.inference_input_type = tf.int8
  converter.inference_output_type = tf.int8
  converter.representative_dataset = tf.lite.RepresentativeDataset(representative_data_gen)
  tfl_model = converter.convert()

  open("model_alt.tflite", "wb").write(tfl_model)

!apt-get update && apt-get -qq install xxd
!xxd -i model_alt.tflite > converted_model_alt.cc

使用 这个 Arduino 代码示例 来测试我的板和相机,效果很好。然后我用自己的字节数组修改了。这给了我错误“初始化失败后调用的 Invoke()”。进一步调查在本节中添加打印输出:

void loop() {
  delay(30*1000);
  // Get image from provider.
  if (kTfLiteOk != GetImage(error_reporter, kNumCols, kNumRows, kNumChannels,
                            input->data.int8)) {
    TF_LITE_REPORT_ERROR(error_reporter, "Image capture failed.");
  }
  
  //Added print out here 
  TF_LITE_REPORT_ERROR(error_reporter, "Bad input tensor, size. %d", input->dims->size);    

  // Run the model on this input and make sure it succeeds.
  if (kTfLiteOk != interpreter->Invoke()) {
    TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed.");
  }

产生值 2113404085。与原始字节数组相同的行产生 4。

将我的 tflite 文件放入 Netron 显示我的输入为 (1, 224, 224, 3) 形状,数据类型为 int8。

我的 Netron 模型

来自示例字节数组的 Netron 模型

我尝试使用更简单的转换:

with tf.device('/device:GPU:0'):
  converter = tf.lite.TFLiteConverter.from_saved_model(modelDir_fine)
  converter.optimizations = [tf.lite.Optimize.DEFAULT]
  tfl_model = converter.convert()

  open("model_alt.tflite", "wb").write(tfl_model)

!apt-get update && apt-get -qq install xxd
!xxd -i model_alt.tflite > converted_model_alt.cc

产生了这个具有 float32 数据类型的 Netron 模型。 Netron float32 数据类型

然后我在arduino代码中将

alignas(8)
更改为
aligns(32)
,这并没有改变打印输出的结果。

在我看来,数据类型之间可能存在错误。

任何人都可以解释我的转换可能出了问题吗?

python tensorflow arduino tflite
1个回答
0
投票

您找到解决这个问题的方法了吗?我也有同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.