TensorFlow lite:将模型转换为tflite后,准确性损失很大

时间:2018-06-20 01:33:57

标签: tensorflow tensorflow-lite

我一直在尝试使用TFLite来提高Android上的检测速度,但是奇怪的是,我的.tflite模型现在几乎只能检测到1个类别。

我已经对经过重新训练的移动网络所获得的.pb模型进行了测试,结果很好,但是由于某种原因,当我将其转换为.tflite时,检测方法还很遥远...

对于再培训,我使用了Tensorflow for poets 2

中的retrain.py文件。

我正在使用以下命令来重新训练,优化推理并将模型转换为tflite:

python retrain.py \
--image_dir ~/tf_files/tw/ \
--tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/feature_vector/1 \
--output_graph ~/new_training_dir/retrainedGraph.pb \
-–saved_model_dir ~/new_training_dir/model/ \
--how_many_training_steps 500 

sudo toco \
--input_file=retrainedGraph.pb \
--output_file=optimized_retrainedGraph.pb \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TENSORFLOW_GRAPHDEF \
--input_shape=1,224,224,3 \
--input_array=Placeholder \
--output_array=final_result \

sudo toco \
--input_file=optimized_retrainedGraph.pb \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--output_file=retrainedGraph.tflite \
--inference_type=FLOAT \
--inference_input_type=FLOAT \
--input_arrays=Placeholder \
--output_array=final_result \
--input_shapes=1,224,224,3

我在这里做错什么了吗?精度损失从何而来?

2 个答案:

答案 0 :(得分:0)

请在GitHub https://github.com/tensorflow/tensorflow/issues上发布问题,然后在此处添加链接。 另外,请添加有关您要为最后一层进行再培训的内容的更多详细信息。

答案 1 :(得分:0)

当我试图将.pb模型转换为.lite时,我遇到了同样的问题。

实际上,我的准确度从95下降到30!

发现我犯的错误不是在将.pb转换为.lite或执行此操作的命令中。但是实际上是在加载图像并对其进行预处理之前,才将其传递到lite模型中并使用

进行推断
interpreter.invoke()

命令。

下面看到的代码是我所说的预处理:

test_image=cv2.imread(file_name)
test_image=cv2.resize(test_image,(299,299),cv2.INTER_AREA)
test_image = np.expand_dims((test_image)/255, axis=0).astype(np.float32)
interpreter.set_tensor(input_tensor_index, test_image)
interpreter.invoke()
digit = np.argmax(output()[0])
#print(digit)
prediction=result[digit]

如您所见,一旦使用“ imread()”读取图像,对图像执行两个关键的命令/预处理:

i)图像的大小应调整为训练期间使用的输入图像/张量的“ input_height”和“ input_width”值。在我的情况下(inception-v3),“ input_height”和“ input_width”均为299。 (请阅读模型的文档以获取该值,或在用于训练或重新训练模型的文件中查找此变量

ii)上面代码中的下一个命令是:

test_image = np.expand_dims((test_image)/255, axis=0).astype(np.float32)

我是从“公式” /模型代码中得到的:

test_image = np.expand_dims((test_image-input_mean)/input_std, axis=0).astype(np.float32)

阅读文档后发现,对于我的体系结构,input_mean = 0,input_std = 255。

当我对代码进行上述更改时,我获得了预期的准确性(90%)。

希望这会有所帮助。