Spec-Zone.ru › TensorFlow C++ 2.4

tensorflow::ops::QuantizeV2

#include <array_ops.h>

Квантование тензора 'input' типа float в тензор 'output' типа 'T'.

Краткое описание

[min_range, max_range] — скалярные числа с плавающей точкой, определяющие диапазон данных в 'input'. Атрибут 'mode' управляет точными вычислениями для преобразования значений с плавающей точкой в их квантованные аналоги. Атрибут 'round_mode' управляет алгоритмом округления при округлении значений с плавающей точкой до их квантованных аналогов.

В режиме 'MIN_COMBINED' каждое значение тензора претерпевает следующее:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0

здесь range(T) = numeric_limits::max() - numeric_limits::min()

Пример режима MIN_COMBINED

Предположим, что входной тип — float, а возможный диапазон — [0.0, 6.0], а выходной тип — quint8 ([0, 255]). Значения min_range и max_range должны быть указаны как 0.0 и 6.0. Квантование с float до quint8 умножит каждое значение входа на 255/6 и приведёт к типу quint8.

Если выходной тип был qint8 ([-128, 127]), операция дополнительно вычтет из каждого значения 128 перед приведением к типу, чтобы диапазон значений соответствовал диапазону qint8.

Если режим — 'MIN_FIRST', то используется такой подход:

num_discrete_values = 1 << (# of bits in T)
range_adjust = num_discrete_values / (num_discrete_values - 1)
range = (range_max - range_min) * range_adjust
range_scale = num_discrete_values / range
quantized = round(input * range_scale) - round(range_min * range_scale) +
  numeric_limits::min()
quantized = max(quantized, numeric_limits::min())
quantized = min(quantized, numeric_limits::max())

Главное отличие от MIN_COMBINED заключается в том, что минимальный диапазон округляется сначала, прежде чем от округлённого значения вычитается. В режиме MIN_COMBINED вводится небольшая погрешность, где повторяющиеся итерации квантования и деквантования будут вводить всё большую и большую ошибку.

Пример режима SCALED

SCALED режим соответствует подходу к квантованию, используемому в QuantizeAndDequantize{V2|V3}.

Если режим — SCALED, квантование выполняется путём умножения каждого входного значения на scaling_factor. Scaling_factor определяется из min_range и max_range как максимально возможное значение, при котором диапазон от min_range до max_range представим в значениях типа T.

  
  
      const int min_T = std::numeric_limits::min();
  const int max_T = std::numeric_limits::max();
  const float max_float = std::numeric_limits::max();
  
  
      const float scale_factor_from_min_side =
      (min_T * min_range > 0) ? min_T / min_range : max_float;
  const float scale_factor_from_max_side =
      (max_T * max_range > 0) ? max_T / max_range : max_float;
  
  
      const float scale_factor = std::min(scale_factor_from_min_side,
                                      scale_factor_from_max_side);

  
  We next use the scale_factor to adjust min_range and max_range as follows:
  
    
      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

  
  e.g. if T = qint8, and initially min_range = -10, and max_range = 9, we would compare -128/-10.0 = 12.8 to 127/9.0 = 14.11, and set scaling_factor = 12.8 In this case, min_range would remain -10, but max_range would be adjusted to 127 / 12.8 = 9.921875
  So we will quantize input values in the range (-10, 9.921875) to (-128, 127).
  The input tensor can now be quantized by clipping values to the range min_range to max_range, then multiplying by scale_factor as follows:
  
    
result = round(min(max_range, max(min_range, input)) * scale_factor)

  
  The adjusted min_range and max_range are returned as outputs 2 and 3 of this operation. These outputs should be used as the range for any further calculations.
  
    narrow_range (bool) attribute
  
  If true, we do not use the minimum quantized value. i.e. for int8 the quantized output, it would be restricted to the range -127..127 instead of the full -128..127 range. This is provided for compatibility with certain inference backends. (Only applies to SCALED mode)
  
    axis (int) attribute
  
  An optional axis attribute can specify a dimension index of the input tensor, such that quantization ranges will be calculated and applied separately for each slice of the tensor along that dimension. This is useful for per-channel quantization.
  If axis is specified, min_range and max_range
  if axis=None, per-tensor quantization is performed as normal.
  
    ensure_minimum_range (float) attribute
  
  Ensures the minimum quantization range is at least this value. The legacy default value for this is 0.01, but it is strongly suggested to set it to 0 for new uses.
  Arguments:
  • scope: Объект Scope
  • min_range: Минимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в output_min. Если задан атрибут axis, это должен быть одномерный тензор, размер которого соответствует размеру измерения axis входных и выходных тензоров.
  • max_range: Максимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в output_max. Если задан атрибут axis, это должен быть одномерный тензор, размер которого соответствует размеру измерения axis входных и выходных тензоров.

Возвращает:

  • Output output: Результат квантования входных данных с плавающей точкой.
  • Output output_min: Конечное минимальное значение диапазона квантования, используемое для обрезания входных значений перед масштабированием и округлением до квантованных значений. Если задан атрибут axis, это будет одномерный тензор, размер которого соответствует размеру измерения axis входных и выходных тензоров.
  • Output output_max: Конечное максимальное значение диапазона квантования, используемое для обрезания входных значений перед масштабированием и округлением до квантованных значений. Если задан атрибут axis, это будет одномерный тензор, размер которого соответствует размеру измерения axis входных и выходных тензоров.
Конструкторы и деструкторы
QuantizeV2(const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T)
QuantizeV2(const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs)
Публичные атрибуты
operation
Operation
output
::tensorflow::Output
output_max
::tensorflow::Output
output_min
::tensorflow::Output
Публичные статические функции
Axis(int64 x)
Attrs
EnsureMinimumRange(float x)
Attrs
Mode(StringPiece x)
Attrs
NarrowRange(bool x)
Attrs
RoundMode(StringPiece x)
Attrs
Структуры
tensorflow::ops::QuantizeV2::Attrs

Дополнительные установки атрибутов для QuantizeV2.

Публичные атрибуты

operation

Operation operation

output

::tensorflow::Output output

output_max

::tensorflow::Output output_max

output_min

::tensorflow::Output output_min

Публичные функции

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

Публичные статические функции

Axis

Attrs Axis(
  int64 x
)

EnsureMinimumRange

Attrs EnsureMinimumRange(
  float x
)

Mode

Attrs Mode(
  StringPiece x
)

NarrowRange

Attrs NarrowRange(
  bool x
)

RoundMode

Attrs RoundMode(
  StringPiece x
)

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/cc/class/tensorflow/ops/quantize-v2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API