Python Google Coral Edge TPU编译模型-推断总是几乎相同

Python Google Coral Edge TPU编译模型-推断总是几乎相同,python,tensorflow,quantization,tpu,google-coral,Python,Tensorflow,Quantization,Tpu,Google Coral,我正在尝试在Google edge TPU Coral上运行MobileNet V2模型(将最后一层重新训练到我的数据集)。我能够用“edgetpu_编译器”(见本页)对模型进行量化和编译。但是当我在TPU中运行推理时,我得到了一个非常不同的输入图像的类似输出 我使用“tflite\u convert”工具对模型进行量化,如下所示: tflite_convert --output_file=./model.tflite --keras_model_file=models/MobileNet2_

我正在尝试在Google edge TPU Coral上运行MobileNet V2模型(将最后一层重新训练到我的数据集)。我能够用“edgetpu_编译器”(见本页)对模型进行量化和编译。但是当我在TPU中运行推理时,我得到了一个非常不同的输入图像的类似输出

我使用“tflite\u 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_编译器”工具为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”]:

这对于任何输入图像几乎都是一样的,通常前两个类具有相同(或非常相似)的值(第三个和第四个类相同),如上面所示的示例所示。一个类的值应为0.99
(在.h5模型中,甚至在没有量化的.tflite模型中也是如此)

它可以是参数
-default\u ranges\u min=0--default\u ranges\u max=6--std\u dev\u values=127--mean\u values=128的东西吗?
我如何计算它们

编辑1:

根据这个答案,我尝试使用
--std_dev_values=127--mean_values=128和--std_dev_values=255--mean_values=0
对模型进行量化,但我仍然得到垃圾推断。由于mobilenet2使用relu6,默认范围应该是
-default\u ranges\u min=0--default\u ranges\u max=6
对吗


该模型是一个经过重新训练的MobileNetv2,输入是一个RGB图像(3个通道),输入形状是1482640,3。

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

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

对珊瑚这样的东西进行培训后,正确的做法是遵循以下步骤 指南(),由Coral团队在此处推荐()


您上面使用的流程更倾向于训练时间量化。

你好,保罗,您解决了这个问题吗?我对mobilenet V1也有类似的问题。不知道怎么解决。刚刚在这里发布了一个问题:还没有,同时我正在尝试重新训练一个已经量化的mobilenetv1模型,遵循以下指南:Coral在推断之前使用枕头来缩小输入图像的比例。不同的枕头版本可能会产生略有不同的输入张量。你能在你的平台上检查枕头版本吗?您是否也可以尝试将输入图像缩小到模型输入大小,并使用该图像进行测试?mobilenetv1上的评论包含了一种训练量化方法,但正如我在评论中所说,它是我在帖子中描述的训练后量化的替代方法。我仍然想找出我在对我已经拥有的mobilenetv2重新训练的模型进行训练后量化方面的错误。为了澄清:通过设置推断类型=量化的UINT8、默认范围最小值、默认范围最大值=6、标准开发值=127——平均值=128来使用tflite转换不是训练后量化的方式。这是转换训练时间量化模型的路径,mobilenet v1没有这种方法。您只有一个浮动模型。在你选择的路径中,给定一个浮点模型,你有效地硬编码了量化的所有方面,没有任何使用真实数据或输入计算出的量化参数。这不管用。正确的方法是我指向的指南。编辑:“mobilenet v2没有”我以前尝试过遵循该指南,结果出现了以下错误:
---------------------------
Class1
Score :  0.2890625
---------------------------
Class2
Score :  0.26953125
---------------------------
Class3
Score :  0.21875
---------------------------
Class4
Score :  0.21875