【问题标题】:Google Coral Edge TPU compiled model - Inference always almost the sameGoogle Coral Edge TPU 编译模型 - 推理总是几乎相同
【发布时间】:2019-09-09 09:31:04
【问题描述】:

我正在尝试让 Mobilenetv2 模型(对我的数据集重新训练的最后一层)在 Google 边缘 TPU Coral 上运行。我可以使用“edgetpu_compiler”(关注此页面https://coral.withgoogle.com/docs/edgetpu/compiler/#usage)来量化和编译模型。但是当我在 TPU 中运行推理时,我会得到与非常不同的输入图像相似的输出。

我使用 'tflite_convert' 工具来量化模型,如下所示:

tflite_convert --output_file=./model.tflite 
--keras_model_file=models/MobileNet2_best-val-acc.h5 --output_format=TFLITE
--inference_type=QUANTIZED_UINT8 --default_ranges_min=0 --default_ranges_max=6 
--std_dev_values=127 --mean_values=128 --input_shapes=1,482,640,3 --input_arrays=input_2

然后我使用 'edgetpu_compiler' 工具为 TPU 编译它:

sudo edgetpu_compiler  model.tflite
Edge TPU Compiler version 2.0.258810407
INFO: Initialized TensorFlow Lite runtime.

Model compiled successfully in 557 ms.

Input model: model.tflite
Input size: 3.44MiB
Output model: model_edgetpu.tflite
Output size: 4.16MiB
On-chip memory available for caching model parameters: 4.25MiB
On-chip memory used for caching model parameters: 3.81MiB
Off-chip memory used for streaming uncached model parameters: 0.00B
Number of Edge TPU subgraphs: 1
Total number of operations: 71
Operation log: model_edgetpu.log
See the operation log file for individual operation details.

然后当我使用此代码运行推理时:

...
labels = ["Class1", "Class2", "Class3", "Class4"]
results = engine.ClassifyWithImage(img, top_k=4)
for result in results:
    print('---------------------------')
    print(labels[result[0]])
    print('Score : ', result[1])

输出是这样的(假设标签[“Class1”,“Class2”,“Class3”,“Class4”]):

---------------------------
Class1
Score :  0.2890625
---------------------------
Class2
Score :  0.26953125
---------------------------
Class3
Score :  0.21875
---------------------------
Class4
Score :  0.21875

对于任何输入图像来说几乎相同,通常前两个类具有相同(或非常非常相似)的值(第三和第四个相同),如上例所示。一个类应该是 0.99 (as it is in the .h5 model or even in the .tflite model without quantization)

可以是-default_ranges_min=0 --default_ranges_max=6 --std_dev_values=127 --mean_values=128?参数的东西吗?我该如何计算它们?

编辑1:

使用post 的答案,我尝试使用--std_dev_values=127 --mean_values=128 and --std_dev_values=255 --mean_values=0 来量化模型,但我仍然得到垃圾推断。由于mobilenet2使用relu6,默认范围应该是-default_ranges_min=0 --default_ranges_max=6吧?

模型是一个重新训练的MobileNetv2,输入是RGB图像(3通道),输入形状是1,482,640,3。

【问题讨论】:

  • 你好 Paulo,你解决了这个问题吗?我在 mobilenet V1 上遇到了类似的问题。不知道如何解决它。刚刚在这里发布了一个问题:stackoverflow.com/questions/57869149/…
  • 还没有,同时我正在尝试重新训练已经量化的 mobilenetv1 模型,遵循本指南:coral.withgoogle.com/docs/edgetpu/…
  • Coral 在推理前使用枕头缩小输入图像。不同的枕头版本可能会产生略有不同的输入张量。你能在你的平台上查看枕头版本吗?您是否也可以尝试将输入图像缩小到模型输入大小并使用该图像进行测试?

标签: python tensorflow quantization tpu google-coral


【解决方案1】:

根据您对 mobilenetv1 的评论,听起来您正在采用重新训练的浮点模型并将其转换为 TFLite。您打算通过运行您列出的命令来量化它。

我建议您仔细查看 TensorFlow lite 文档。一般来说,有两种量化方式(在训练期间进行和在训练后进行)。您似乎想要采取的方法是训练后。

对像 Coral 这样的东西进行后期训练的正确方法是遵循这个 指南 (https://www.tensorflow.org/lite/performance/post_training_integer_quant),这里是 Coral 团队推荐的 (https://coral.withgoogle.com/news/updates-07-2019/)。

您在上面使用的流程更适合训练时间量化。

【讨论】:

  • 关于 mobilenetv1 的评论是一种训练量化的方法,但正如我在评论中所说,它是我在帖子中描述的训练后量化的替代方案。我仍然想在我已经拥有的 mobilenetv2 重新训练模型的训练后量化上找出我做错了什么。
  • 澄清:通过设置 inference_type=QUANTIZED_UINT8, default_ranges_min, default_ranges_max=6, std_dev_values=127 --mean_values=128 来使用 tflite_convert 并不是训练后量化的完成方式。这就是转换训练时间量化模型的路径,而 mobilenet v1 没有这种方法。你只有一个浮动模型。在您采用的路径中,给定一个浮点模型,您有效地对量化的所有方面进行硬编码,而无需使用真实数据或输入计算任何量化参数。这行不通。正确的方法是我指向的指南。
  • 编辑:“mobilenet v2 所没有的”
  • 我之前尝试过遵循这个指南,结果出现了这个错误:stackoverflow.com/questions/57234308/…
猜你喜欢
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2019-08-06
相关资源
最近更新 更多