Spec-Zone.ru › TensorFlow C++ 1.15

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, мы не используем весь диапазон выходного типа, выбирая исключить минимально возможное значение для симметрии (например, диапазон вывода от -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)

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

Аргументы:

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

Возвращаемое значение:

  • Output output: Квантованные данные, полученные из входных данных с плавающей точкой.
  • Output output_min: Фактическое минимальное скалярное значение, используемое для вывода.
  • Output output_max: Фактическое максимальное скалярное значение, используемое для вывода.
Конструкторы и деструкторы
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
Публичные статические функции
Mode(StringPiece 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
)

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

Режим

Attrs Mode(
  StringPiece x
)

Режим округления

Attrs RoundMode(
  StringPiece x
)

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

Spec-Zone.ru

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