如何训练 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 量化模型?
这是我尝试的步骤:
- 从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
验证模型是否正确训练,input/output张量名称是否正确
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.
--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
我从 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
验证模型是否正确训练,input/output张量名称是否正确
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.
--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