我使用迁移学习教程创建了一个 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。
我尝试使用更简单的转换:
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)
,这并没有改变打印输出的结果。
在我看来,数据类型之间可能存在错误。
任何人都可以解释我的转换可能出了问题吗?
您找到解决这个问题的方法了吗?我也有同样的问题。