tf.quantization.quantize
Квантует тензор «input» типа float в тензор «output» типа «T».
tf.quantization.quantize(
input,
min_range,
max_range,
T,
mode='MIN_COMBINED',
round_mode='HALF_AWAY_FROM_ZERO',
name=None,
narrow_range=False,
axis=None,
ensure_minimum_range=0.01
)
[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<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 | Tensor типа float32. Минимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в output_min. Если задан атрибут axis, это должен быть одномерный тензор, размер которого соответствует измерению axis входного и выходного тензоров. |
max_range | Tensor типа float32. Максимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в 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 | Tensor типа T. |
output_min | Tensor типа float32. |
output_max | Tensor типа float32. |
© 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/quantization/quantize