тензорный поток:: опс:: КвантизацияV2

#include <array_ops.h>

Квантовать «входной» тензор типа float до «выходного» тензора типа «T».

Краткое содержание

[min_range, max_range] — скалярные числа с плавающей запятой, которые определяют диапазон для «входных» данных. Атрибут 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() range(T) = numeric_limits ::max() - numeric_limits ::min() 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. Квантование от числа с плавающей запятой до 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 соответствует подходу квантования, используемому в QuantizeAndDequantize{V2|V3} .

Если режим SCALED , квантование выполняется путем умножения каждого входного значения на коэффициент масштабирования. 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);

Затем мы используем коэффициент масштабирования для настройки min_range и max_range следующим образом:

      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

например, если T = qint8 и изначально min_range = -10 и max_range = 9, мы бы сравнили -128/-10,0 = 12,8 с 127/9,0 = 14,11 и установили scaling_factor = 12,8. В этом случае min_range останется -10, но max_range будет скорректирован до 127/12,8 = 9,921875.

Поэтому мы будем квантовать входные значения в диапазоне от (-10, 9,921875) до (-128, 127).

Входной тензор теперь можно квантовать путем обрезки значений до диапазона min_range до max_range , а затем умножения на масштабный_фактор следующим образом:

result = round(min(max_range, max(min_range, input)) * scale_factor)

Скорректированные min_range и max_range возвращаются как выходные данные 2 и 3 этой операции. Эти выходные данные следует использовать в качестве диапазона для любых дальнейших расчетов.

Атрибут узкого_диапазона (логическое значение)

Если это правда, мы не используем минимальное квантованное значение. т.е. для int8 квантованного вывода он будет ограничен диапазоном -127..127 вместо полного диапазона -128..127. Это предусмотрено для совместимости с некоторыми механизмами вывода. (Применимо только к режиму МАСШТАБИРОВАНИЕ)

Атрибут оси (int)

Необязательный атрибут axis может указывать индекс измерения входного тензора, так что диапазоны квантования будут рассчитываться и применяться отдельно для каждого среза тензора вдоль этого измерения. Это полезно для поканального квантования.

Если указана ось, min_range и max_range.

если axis = None, потензорное квантование выполняется как обычно.

Атрибут обеспечения_минимального_диапазона (с плавающей запятой)

Обеспечивает, чтобы минимальный диапазон квантования был не ниже этого значения. Устаревшее значение по умолчанию — 0,01, но для новых применений настоятельно рекомендуется установить его на 0.

Аргументы:

  • область: объект области .
  • min_range: минимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в output_min . Если атрибут axis указан, это должен быть одномерный тензор, размер которого соответствует размерности axis входного и выходного тензоров.
  • max_range: максимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в output_max . Если атрибут axis указан, это должен быть одномерный тензор, размер которого соответствует размерности axis входного и выходного тензоров.

Возврат:

  • Output вывод: квантованные данные, полученные из входного числа с плавающей запятой.
  • Output : окончательный минимум диапазона квантования, используемый для обрезки входных значений перед масштабированием и округлением их до квантованных значений. Если указан атрибут axis , это будет одномерный тензор, размер которого соответствует размерности axis входного и выходного тензоров.
  • Output выход_макс: окончательный максимум диапазона квантования, используемый для обрезки входных значений перед масштабированием и округлением их до квантованных значений. Если указан атрибут 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
output
output_max
output_min

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

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool x)
RoundMode (StringPiece x)

Структуры

tensorflow::ops:: QuantizeV2:: Attrs

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

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

операция

Operation operation

выход

::tensorflow::Output output

выход_макс

::tensorflow::Output output_max

выходной_мин

::tensorflow::Output output_min

Общественные функции

КвантизацияV2

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

КвантизацияV2

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

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

Ось

Attrs Axis(
  int64 x
)

Обеспечить минимальный диапазон

Attrs EnsureMinimumRange(
  float x
)

Режим

Attrs Mode(
  StringPiece x
)

Узкий диапазон

Attrs NarrowRange(
  bool x
)

Раундрежим

Attrs RoundMode(
  StringPiece x
)