如何训练 mobilenet-v1 量化模型以在 TF Lite 上使用

How to train mobilenet-v1 quantized model to use on TF Lite

我从 Tensorflow Hub 重新训练了一个 mobilenet-v1 图像分类模型,并使用 toco 将其转换为使用 Tensorflow Lite 进行推理。

但是,当我 运行 使用 tflite 模型进行推理时,它需要的输入大小与我在 --input_shape 中指定的输入大小不同。

如何在我自己的数据上重新训练 mobilenetv1 量化模型?

这是我尝试的步骤:

虽然我指定了--input_shape=1,224,224,3,但是当我运行推理的时候,我得到了一个错误:

java.lang.IllegalArgumentException: DataType (1) of input data does not match with the DataType (3) of model inputs.

--input_data_type="" 或 --input_data_types="" >> 输入数组类型(如果图中未提供)。通常需要在将任意数组传递给 --input_arrays 时指定。

在我的例子中不需要它(我使用了 MobileNet_V2 预训练模型)。

您必须在命令中添加更多参数(--mean_value --std_value --default_ranges_min 和 --default_ranges_max )以进行量化。

如 gihub documentation 页面所述,以下命令对我有效

bazel-bin/tensorflow/contrib/lite/toco/toco --input_file=~/tf_files/retrained_graph_mobileNet_v2_100_224.pb --output_file=~/tf_files/retrained_graph_mobileNet_q_v2_100_224.tflite --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --inference_type=QUANTIZED_UINT8 --input_shape=1,224,224,3 --input_array=Placeholder --output_array=final_result --mean_value=128 --std_value=128 --default_ranges_min=0 --default_ranges_max=6

也许我错了,

但是数据类型错误似乎不​​是输入数据的形状问题,而是更多的数据类型问题。

如果您量化模型,这意味着您将数据类型从 float32 更改为 int8。

根据您运行您的模型的不同,有不同类型的量化。

  • 使用神经处理器大多需要全量化。 -- 这意味着输入和输出需要量化以及权重和偏差(偏差不是 int8 而是 int32)
  • 使用量化只是为了让模型更小更快,但你 不要 运行 它在神经处理器上,“半”量化就可以了。 -- 意思是只量化权重就可以了。

还有其他量化方法,但我的目标是:如果你进行了完全量化,要么你有一个量化层为你完成从 float32 到 int8 的转换,要么你的模型需要 int8输入。

编辑: 我刚刚看到您将输入确定为 FLOAT。也许 float32 是正确的术语。至少你的输入数据类型与第一层输入类型有些不对。

您可以使用 Netron 之类的工具来查看您的输入层并查看预期结果。该工具还可用于识别网络的量化方式。

祝你好运,省钱。

快进到 2020 年,现在训练 TF Lite 图像分类模型的最简单方法是使用 TF Lite Model Maker。 https://www.tensorflow.org/lite/tutorials/model_maker_image_classification

可以使用 ML 模型绑定插件将输出的 TF Lite 模型拖放到 Android Studio 中。请参阅此视频中的端到端流程。 https://www.youtube.com/watch?v=s_XOVkjXQbU