Spec-Zone.ru › TensorFlow

tf.raw_ops.QuantizeV2

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

Показать псевдонимы

Совместимые псевдонимы для миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.raw_ops.QuantizeV2

tf.raw_ops.QuantizeV2(
    input,
    min_range,
    max_range,
    T,
    mode='MIN_COMBINED',
    round_mode='HALF_AWAY_FROM_ZERO',
    narrow_range=False,
    axis=-1,
    ensure_minimum_range=0.01,
    name=None
)

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

В режиме '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<T>::max() - numeric_limits<T>::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<T>::min()
quantized = max(quantized, numeric_limits<T>::min())
quantized = min(quantized, numeric_limits<T>::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<T>::min();
const int max_T = std::numeric_limits<T>::max();
const float max_float = std::numeric_limits<float>::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);

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

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

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

Атрибут narrow_range (bool)

Если значение равно true, минимальное квантованное значение не используется. То есть для квантованного результата типа int8 диапазон будет ограничен значениями от -127 до 127 вместо полного диапазона от -128 до 127. Эта возможность предусмотрена для совместимости с некоторыми серверными компонентами инференса. (Применяется только в режиме SCALED.)

Атрибут axis (int)

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

Если задан axis, min_range и max_range

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

Атрибут ensure_minimum_range (float)

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

Аргументы
input float32 типа Tensor.
min_range float32 типа Tensor. Минимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в output_min. Если задан атрибут axis, это должен быть одномерный тензор, размер которого совпадает с размерностью axis входного и выходного тензоров.
max_range float32 типа Tensor. Максимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в output_max. Если задан атрибут axis, это должен быть одномерный тензор, размер которого совпадает с размерностью axis входного и выходного тензоров.
T tf.DType из: tf.qint8, tf.quint8, tf.qint32, tf.qint16, tf.quint16.
mode Необязательный string из: "MIN_COMBINED", "MIN_FIRST", "SCALED". По умолчанию — "MIN_COMBINED".
round_mode Необязательный string из: "HALF_AWAY_FROM_ZERO", "HALF_TO_EVEN". По умолчанию — "HALF_AWAY_FROM_ZERO".
narrow_range Необязательный bool. По умолчанию — False.
axis Необязательный int. По умолчанию — -1.
ensure_minimum_range Необязательный float. По умолчанию — 0.01.
name Имя операции (необязательно).
Возвращаемые значения
Кортеж из объектов Tensor (output, output_min, output_max).
output T типа Tensor.
output_min float32 типа Tensor.
output_max float32 типа Tensor.

© 2022 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/api_docs/python/tf/raw_ops/QuantizeV2

Spec-Zone.ru

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