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

时间:2018-06-22 08:36:55

标签: tensorflow-lite

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

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

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

这是我尝试的步骤:

  • 从tensorflow下载诗人codelab的训练数据集
  • 使用上面的数据集
  • Retrain在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.

3 个答案:

答案 0 :(得分:0)

-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

答案 1 :(得分:0)

也许我错了,

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

如果对模型进行量化,则意味着将数据类型从float32更改为int8。

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

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

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

编辑:我刚刚看到您将输入确定为FLOAT。也许float32是正确的术语。与第一层输入类型相比,输入数据类型至少存在一些问题。

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

祝你好运,请保存下来。

答案 2 :(得分:0)

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

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