我从Tensorflow Hub重新训练了mobilenet-v1图像分类模型,并使用toco对其进行了转换,以使用Tensorflow Lite进行推理。
但是,当我使用tflite模型运行推理时,它需要的输入大小与我用--input_shape
指定的大小不同。
如何根据自己的数据重新训练mobilenetv1量化模型?
这是我尝试的步骤:
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.
答案 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。
根据模型的运行方式,有不同的量化类型。
还有其他量化方法,但是我的目标是:如果您进行了完全量化,要么您包含了一个量化层,可以为您完成从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