тензорный поток:: опс:: Квантизация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
, квантование выполняется путем умножения каждого входного значения на коэффициент масштабирования. 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);Затем мы используем коэффициент масштабирования для настройки 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
, а затем умножения на масштабный_фактор следующим образом:
result = round(min(max_range, max(min_range, input)) * scale_factor)Скорректированные
min_range
иmax_range
возвращаются как выходные данные 2 и 3 этой операции. Эти выходные данные следует использовать в качестве диапазона для любых дальнейших расчетов.Атрибут узкого_диапазона (логическое значение)
Если это правда, мы не используем минимальное квантованное значение. т.е. для int8 квантованного вывода он будет ограничен диапазоном -127..127 вместо полного диапазона -128..127. Это предусмотрено для совместимости с некоторыми механизмами вывода. (Применимо только к режиму МАСШТАБИРОВАНИЕ)
Атрибут оси (int)
Необязательный атрибут
axis
может указывать индекс измерения входного тензора, так что диапазоны квантования будут рассчитываться и применяться отдельно для каждого среза тензора вдоль этого измерения. Это полезно для поканального квантования.Если указана ось, min_range и max_range.
если
axis
= None, потензорное квантование выполняется как обычно.Атрибут обеспечения_минимального_диапазона (с плавающей запятой)
Обеспечивает, чтобы минимальный диапазон квантования был не ниже этого значения. Устаревшее значение по умолчанию — 0,01, но для новых применений настоятельно рекомендуется установить его на 0.
Аргументы:
- область: объект области.
- min_range: минимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в
output_min
. Если указан атрибутaxis
, это должен быть одномерный тензор, размер которого соответствует размерностиaxis
входного и выходного тензоров. - max_range: максимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в
output_max
. Если указан атрибутaxis
, это должен быть одномерный тензор, размер которого соответствует размерностиaxis
входного и выходного тензоров.
Возврат:
-
Output
вывод: квантованные данные, полученные из входного числа с плавающей запятой. -
Output
: окончательный минимум диапазона квантования, используемый для обрезки входных значений перед масштабированием и округлением их до квантованных значений. Если указан атрибутaxis
, это будет одномерный тензор, размер которого соответствует размерностиaxis
входного и выходного тензоров. -
Output
выход_макс: окончательный максимум диапазона квантования, используемый для обрезки входных значений перед масштабированием и округлением их до квантованных значений. Если указан атрибут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
выход
::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 Axis( int64 x )
Обеспечить минимальный диапазон
Attrs EnsureMinimumRange( float x )
Режим
Attrs Mode( StringPiece x )
Узкий диапазон
Attrs NarrowRange( bool x )
Круглый режим
Attrs RoundMode( StringPiece x )