“数字化”在解释器.get_input_details()中是什么意思?

时间:2019-02-22 15:18:04

标签: python tensorflow tensorflow-lite quantization

使用tflite并获取解释器的属性,例如:

print(interpreter.get_input_details())

[{'name': 'input_1_1', 'index': 47, 'shape': array([  1, 128, 128,   3], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.003921568859368563, 0)}]

'quantization': (0.003921568859368563, 0)是什么意思?

2 个答案:

答案 0 :(得分:2)

表示量化参数值:输入张量的标度和零点。

这是使用公式将量化的uint8数q转换为浮点数f所必需的:

f = (q - zero_point) * scale

答案 1 :(得分:0)

不幸的是,documentation of get_input_details 没有解释:

<块引用>
Returns: A list of input details.

但是如果您查看源代码 get_input_details,它会调用 _get_tensor_details (source),并且该函数确实记录了它:

    """Gets tensor details.
    Args:
      tensor_index: Tensor index of tensor to query.
    Returns:
      A dictionary containing the following fields of the tensor:
        'name': The tensor name.
        'index': The tensor index in the interpreter.
        'shape': The shape of the tensor.
        'quantization': Deprecated, use 'quantization_parameters'. This field
            only works for per-tensor quantization, whereas
            'quantization_parameters' works in all cases.
        'quantization_parameters': The parameters used to quantize the tensor:
          'scales': List of scales (one if per-tensor quantization)
          'zero_points': List of zero_points (one if per-tensor quantization)
          'quantized_dimension': Specifies the dimension of per-axis
              quantization, in the case of multiple scales/zero_points.

这是什么意思?

这些量化参数是用于量化的值(将一系列数字从一个范围转换为另一个更有限的范围,例如 0-10 到 0-1)。在 TensorFlow 中,这专门用于表示当数据类型更改为支持较少数字的数据类型时:例如float32 到 float16,或 float32 到 uint8,或 float16 到 int8。反量化则相反(例如,当您想从量化为 uint8 且量化输出介于 0-255 之间的模型中获取概率时)。

数学很简单,就像更一般的形式规范化(使范围从(0 到 1):

  • 量化:q = (f / s) + z
  • 去量化:f = (q - z) * s
  • 有关此量化方程的更多信息,请参阅 Quantization Specification

注意: Aleksandr Kondratyev 的方程 f = (q - zero_point) * scale 实际上是反量化,因为它采用 q(量化值)并为您提供 f(浮点数)。当然你可以把等式反过来得到另一个。