тензорный поток:: опс:: Квантизация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 , мы не используем весь диапазон типа выходного сигнала, выбирая для исключения наименьшее возможное значение симметрии (например, выходной диапазон составляет от -127 до 127, а не от -128 до 127 для знакового 8-битного квантования). так что 0,0 отображается в 0.

Сначала мы находим диапазон значений в нашем тензоре. Используемый нами диапазон всегда центрирован на 0, поэтому мы находим m такое, что

  m = max(abs(input_min), abs(input_max))

Тогда наш диапазон входного тензора будет [-m, m] .

Далее мы выбираем сегменты квантования с фиксированной точкой, [min_fixed, max_fixed] . Если T подписано, это

  num_bits = sizeof(T) * 8
  [min_fixed, max_fixed] =
      [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]

В противном случае, если T не имеет знака, диапазон фиксированной точки равен

  [min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

Исходя из этого, мы вычисляем наш коэффициент масштабирования s:

  s = (max_fixed - min_fixed) / (2 * m)

Теперь мы можем квантовать элементы нашего тензора:

result = round(input * s)

Следует обратить внимание на то, что оператор может немного скорректировать запрошенные минимальное и максимальное значения во время процесса квантования, поэтому вам всегда следует использовать выходные порты в качестве диапазона для дальнейших вычислений. Например, если запрошенные минимальное и максимальное значения близки к равным, они будут разделены небольшим значением эпсилон, чтобы предотвратить создание неправильно сформированных квантованных буферов. В противном случае вы можете получить буферы, в которых все квантованные значения сопоставляются с одним и тем же значением с плавающей запятой, что вызывает проблемы для операций, которые должны выполнять над ними дальнейшие вычисления.

Аргументы:

  • область: объект области .
  • min_range: минимальное скалярное значение, которое может быть получено для ввода.
  • max_range: максимальное скалярное значение, которое может быть получено для ввода.

Возврат:

  • Output вывод: квантованные данные, полученные из входного числа с плавающей запятой.
  • Output : фактическое минимальное скалярное значение, используемое для вывода.
  • Output выход_макс: фактическое максимальное скалярное значение, используемое для выхода.

Конструкторы и деструкторы

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

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

Mode (StringPiece 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 Mode(
  StringPiece x
)

Раундрежим

Attrs RoundMode(
  StringPiece x
)