我有一个预存储的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]]]]
任何想法如何正确执行?谢谢。