tensorflow::ops::QuantizeV2
#include <array_ops.h>
Квантует тензор 'input' типа float в тензор 'output' типа 'T'.
Краткое описание
[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
Пример режима 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, квантование выполняется умножением каждого входного значения на scaling_factor. Значение 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);Затем мы используем 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.
Аргументы:
- scope: объект Scope
- min_range: минимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в
output_min. Если указан атрибутaxis, это должен быть одномерный тензор, размер которого совпадает с размером измеренияaxisвходного и выходного тензоров. - max_range: максимальное значение диапазона квантования. Это значение может быть скорректировано операцией в зависимости от других параметров. Скорректированное значение записывается в
output_max. Если указан атрибутaxis, это должен быть одномерный тензор, размер которого совпадает с размером измеренияaxisвходного и выходного тензоров.
Возвращает:
-
Outputoutput: квантованные данные, полученные из входных данных типа float. -
Outputoutput_min: минимальная граница окончательного диапазона квантования, используемая для ограничения входных значений перед масштабированием и округлением до квантованных значений. Если указан атрибутaxis, это будет одномерный тензор, размер которого совпадает с размером измеренияaxisвходного и выходного тензоров. -
Outputoutput_max: максимальная граница окончательного диапазона квантования, используемая для ограничения входных значений перед масштабированием и округлением до квантованных значений. Если указан атрибут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 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 )
Общедоступные статические функции
Axis
Attrs Axis( int64 x )
EnsureMinimumRange
Attrs EnsureMinimumRange( float x )
Mode
Attrs Mode( StringPiece x )
NarrowRange
Attrs NarrowRange( bool x )
RoundMode
Attrs RoundMode( StringPiece x )
© 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/cc/class/tensorflow/ops/quantize-v2