我试图获取Mobilenetv2模型(将最后一层重新训练到我的数据集中)以在Google Edge 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
对于任何输入图像它几乎是相同的,通常,前两个类具有相同(或非常相似)的值(第三和第四相同),如上例所示。一班(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。
答案 0 :(得分:1)
从您对mobilenetv1的评论看来,您正在采用经过重新训练的float模型并将其转换为TFLite。您打算通过运行列出的命令对其进行量化。
我建议您仔细阅读TensorFlow lite文档。通常,有两种量化方法(在训练时进行量化,在训练后进行量化)。您似乎想采用的方法是后期培训。
对诸如珊瑚之类的东西进行训练后的正确方法是遵循此步骤 指南(https://www.tensorflow.org/lite/performance/post_training_integer_quant),如此处的珊瑚团队(https://coral.withgoogle.com/news/updates-07-2019/)所建议。
您上面使用的流程更适合于训练时间量化。