0

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

但是,当我使用 tflite 模型运行推理时,它需要的输入大小与我使用--input_shape.

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

这是我尝试的步骤:

  • 从 tensorflow 为诗人 codelab 下载训练数据
  • 使用上面的数据集在 TF Hub 上重新训练mobilenet v1 量化模型

    python retrain.py \ --bottleneck_dir="${IMAGE_DIR}"/tf_files/bottlenecks/ \ --how_many_training_steps=1000 \ --model_dir="${IMAGE_DIR}"/tf_files/models/mobilenet_v1_050_224 \ --summaries_dir="${IMAGE_DIR}"/tf_files/training_summaries/mobilenet_v1_050_224/ \ --output_graph="${IMAGE_DIR}"/tf_files/retrained_mobilenet_v1_050_224.pb \ --output_labels="${IMAGE_DIR}"/tf_files/retrained_labels.txt \ --tfhub_module=https://tfhub.dev/google/imagenet/mobilenet_v1_050_224/quantops/classification/1 \ --image_dir="${IMAGE_DIR}"/tf_files/flower_photos

  • 验证模型是否经过正确训练,输入/输出张量名称是否正确 python label_image.py \ --graph="${IMAGE_DIR}"/tf_files/retrained_mobilenet_v1_050_224.pb \ --labels="${IMAGE_DIR}"/tf_files/retrained_labels.txt \ --input_layer=Placeholder \ --output_layer=final_result \ --input_height=224 --input_width=224 \ --image="${IMAGE_DIR}"/tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg

  • 将模型转换为 tflite

    toco \ --input_file="${IMAGE_DIR}"/tf_files/retrained_mobilenet_v1_050_224.pb \ --output_file="${IMAGE_DIR}"/tf_files/mobilenet_v1_050_224_quant.tflite \ --input_format=TENSORFLOW_GRAPHDEF \ --output_format=TFLITE \ --input_shape=1,224,224,3 \ --input_array=Placeholder \ --output_array=final_result \ --inference_type=QUANTIZED_UINT8 \ --input_data_type=FLOAT

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

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

4

3 回答 3

0

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

在我的情况下,它是不需要的(我使用了 MobileNet_V2 预训练模型)。

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

如 gihub文档页面中所述,以下命令适用于我

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
于 2018-06-22T11:47:25.860 回答
0

也许我错了,

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

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

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

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

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

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

您可以使用像Netron这样的工具来查看您的输入层并查看预期的内容。该工具还可用于识别您的网络是如何量化的。

祝你好运,并保持保存。

于 2020-06-30T09:24:53.640 回答
0

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

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

于 2020-07-08T00:54:05.397 回答