Quantize

публичный финальный класс Quantize

Квантовать «входной» тензор типа 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() - числовые_пределы ::мин()`

Пример режима 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<T>::min()
 quantized = max(quantized, numeric_limits<T>::min())
 quantized = min(quantized, numeric_limits<T>::max())
 
Самая большая разница между этим режимом и MIN_COMBINED заключается в том, что минимальный диапазон сначала округляется, а затем вычитается из округленного значения. При использовании MIN_COMBINED вводится небольшое смещение, при котором повторяющиеся итерации квантования и деквантования будут приводить к все большей и большей ошибке.

Режим МАСШТАБИРОВАНИЕ Пример

Режим SCALED соответствует подходу квантования, используемому в QuantizeAndDequantize{V2|V3}`.

Если режим «SCALED», квантование выполняется путем умножения каждого входного значения на коэффициент масштабирования. Коэффициент масштабирования определяется из 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);
 
Затем мы используем коэффициент масштабирования для настройки 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)

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

Если указана ось, min_range и max_range.

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

Атрибут обеспечения_минимального_диапазона (с плавающей запятой)

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

Вложенные классы

сорт Квантизация.Параметры Дополнительные атрибуты для Quantize

Константы

Нить OP_NAME Название этой операции, известное основному движку TensorFlow.

Публичные методы

статический Quantize.Options
ось (длинная ось)
static <T расширяет TType > Квантовать <T>
create ( Область действия, Операнд < TFloat32 > ввод, Операнд < TFloat32 > minRange, Операнд < TFloat32 > maxRange, Класс <T> T, Опции... опции)
Фабричный метод для создания класса, обертывающего новую операцию квантования.
статический Quantize.Options
обеспеченияМинимумРанге (Float ОбеспечениеМинимумРанге)
статический Quantize.Options
режим (строковый режим)
статический Quantize.Options
узкий диапазон (логическое значение узкого диапазона)
Выход <Т>
выход ()
Квантованные данные, полученные из входных данных с плавающей запятой.
Вывод <TFloat32>
выходМакс ()
Максимальный окончательный диапазон квантования, используемый для обрезки входных значений перед их масштабированием и округлением до квантованных значений.
Вывод <TFloat32>
выходМин ()
Минимальный окончательный диапазон квантования, используемый для обрезки входных значений перед их масштабированием и округлением до квантованных значений.
статический Quantize.Options
roundMode (строка roundMode)

Унаследованные методы

Константы

общедоступная статическая финальная строка OP_NAME

Название этой операции, известное основному движку TensorFlow.

Постоянное значение: «QuantizeV2».

Публичные методы

общедоступная статическая ось Quantize.Options (длинная ось)

public static Quantize <T> create (область области действия , операнд <TFloat32> ввод, операнд < TFloat32 > minRange, операнд < TFloat32 > maxRange, класс<T> T, параметры... параметры)

Фабричный метод для создания класса, обертывающего новую операцию квантования.

Параметры
объем текущий объем
миндиапазон Минимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в `output_min`. Если указан атрибут «ось», это должен быть одномерный тензор, размер которого соответствует размерности «оси» входного и выходного тензоров.
МаксДиапазон Максимальное значение диапазона квантования. Это значение может быть скорректировано оператором в зависимости от других параметров. Скорректированное значение записывается в `output_max`. Если указан атрибут «ось», это должен быть одномерный тензор, размер которого соответствует размерности «оси» входного и выходного тензоров.
параметры содержит значения необязательных атрибутов
Возврат
  • новый экземпляр Quantize

общедоступный статический Quantize.Options обеспеченияМинимумРанге (Float ОбеспечениеМинимумРанге)

общедоступный статический режим Quantize.Options (режим String)

public static Quantize.Options узкий диапазон (логическое значение узкого диапазона)

публичный вывод <T> вывод ()

Квантованные данные, полученные из входных данных с плавающей запятой.

публичный вывод <TFloat32> outputMax ()

Максимальный окончательный диапазон квантования, используемый для обрезки входных значений перед их масштабированием и округлением до квантованных значений. Если указан атрибут «ось», это будет одномерный тензор, размер которого соответствует размерности «оси» входного и выходного тензоров.

публичный вывод <TFloat32> outputMin ()

Минимальный окончательный диапазон квантования, используемый для обрезки входных значений перед их масштабированием и округлением до квантованных значений. Если указан атрибут «ось», это будет одномерный тензор, размер которого соответствует размерности «оси» входного и выходного тензоров.

public static Quantize.Options roundMode (String roundMode)