首页 > 解决方案 > Tensorflow Lite toco --mean_values --std_values?

问题描述

所以我用假量化训练了一个张量流模型,并用 .pb 文件作为输出冻结它。现在我想将此 .pb 文件提供给 tensorflow lite toco 以进行完全量化并获取 .tflite 文件。

我正在使用这个张量流示例:https ://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/experimental/micro/examples/micro_speech

我有疑问的部分:

bazel run tensorflow/lite/toco:toco -- \
--input_file=/tmp/tiny_conv.pb --output_file=/tmp/tiny_conv.tflite \
--input_shapes=1,49,43,1 --input_arrays=Reshape_1 --output_arrays='labels_softmax' \
--inference_type=QUANTIZED_UINT8 --mean_values=0 --std_values=2 \
--change_concat_input_ranges=false

上述部分调用 toco 并进行转换。请注意,mean_values 设置为 0,std_values 由 Google 设置为 2。他们是如何计算这两个值的?对于这个特定的模型,它被训练来识别单词“yes”和“no”。如果我想识别这 10 位数字,在这种情况下是否需要更改均值和标准值?我没有找到任何说明这部分的官方文档。任何帮助,将不胜感激。

标签: tensorflowtensorflow-lite

解决方案


对于 uint8 量化模型,输入值预计在 0 到 255 的范围内。即使使用 FakeQuantization,训练期间的输入值通常是不同范围内的浮点值(例如,0.0 到 1.0)。mean_value 和 std_value 控制 0 到 255 范围内的 uint8 值如何映射到训练期间使用的浮点值。您可以使用此启发式方法来确定这些值:

mean_value = [0, 255] 范围内对应于浮点 0.0 的 uint8 值。因此,如果浮点范围为 [0.0, 1.0],则 mean_value = 0。

std_value = (uint8_max - uint8_min) / (float_max - float_min)。因此,如果浮点范围为 [0.0, 1.0],则 std_value = 255 / 1.0 = 255。

我们正在努力使这更简单。希望这可以帮助!


推荐阅读