tflite和pb文件的结果不同

时间:2019-12-02 11:00:52

标签: python tensorflow

我有一个预存储的pb文件,想将pb文件转换为tflite格式。我假设来自两个推理文件的结果应该相似,但它们是不同的。

使用通过tflite_convert命令进行的自动转换,它将pb文件的输入自动更改为float32格式,但是量化参数在0到255之间转换。默认命令和我用于默认转换的参数如下所示(从“ https://www.tensorflow.org/lite/convert/cmdline_examples中获得)。

"tflite_convert \
  --output_file=/tmp/foo.tflite \
  --graph_def_file=/tmp/mobilenet_v1_0.50_128/frozen_graph.pb \
  --input_arrays=input \
  --output_arrays=MobilenetV1/Predictions/Reshape_1"

原始pb文件以uint8作为输入,而转换后的tflite文件则以float32类型作为输入。请注意,每个模型中定义的两种输入类型均定义为float32。

从这里开始,我认为tensorflow 1.14.0中的session.run函数以某种方式将uint8转换为float32格式。我认为它如何转换数据应该解决这个问题。

要推断结果,我只是将一个图像numpy数组转换为float32格式并进行了推断。但是,原始pb文件和tflite文件之间的结果是完全不同的。结果的一部分写在下面。

pb result float32
  [-6.62927050e-05 -8.83461908e-05  2.43029790e-04 ... -3.24912253e-05
      1.34146120e-03  7.10181776e-04]]]]

tflite result
    [ 3.94842401e-03 -9.21457410e-02  1.38981268e-02 ... -3.03635316e-05
      9.35746357e-06  1.34435541e-05]]]]

因此,我用--inference_input_type选项和QUANTIZED_UINT8参数值(具有不同的--std_dev_value和--mean_values值)转换了模型。

在测试之前,我使用不同的归一化方法测试了pb推断。 uint8类型的原始numpy数组被转换为几个不同的范围(-1到1,和0到1)。我发现从0到1转换为float32可以正常进行预处理。

更改输入类型后,它仍会生成不同的输出。

tflite uint8 std 127 mean 128
    [-6.89294562e-03 -1.24600708e-01  2.46452517e-03 ... -3.03635316e-05
      9.35746357e-06  1.34435541e-05]]]]

tflite uint8 std 128 mean 128
    [ 4.23834100e-03 -1.53582871e-01  1.10723898e-02 ... -3.03635316e-05
      9.35746357e-06  1.34435541e-05]]]]


tflite uint8 std 255 mean 0
   [ 3.94842401e-03 -9.21457410e-02  1.38981268e-02 ... -3.03635316e-05
      9.35746357e-06  1.34435541e-05]]]]

任何想法如何正确执行?谢谢。

0 个答案:

没有答案