тензорный поток:: опс:: Квантизация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
, мы не используем весь диапазон типа выходного сигнала, выбирая для исключения наименьшее возможное значение симметрии (например, выходной диапазон составляет от -127 до 127, а не от -128 до 127 для знакового 8-битного квантования). так что 0,0 отображается в 0.
Сначала мы находим диапазон значений в нашем тензоре. Используемый нами диапазон всегда центрирован на 0, поэтому мы находим m такое, что
m = max(abs(input_min), abs(input_max))
Тогда наш диапазон входного тензора будет [-m, m]
.
Далее мы выбираем сегменты квантования с фиксированной точкой, [min_fixed, max_fixed]
. Если T подписано, это
num_bits = sizeof(T) * 8 [min_fixed, max_fixed] = [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]
В противном случае, если T не имеет знака, диапазон фиксированной точки равен
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
Исходя из этого, мы вычисляем наш коэффициент масштабирования s:
s = (max_fixed - min_fixed) / (2 * m)
Теперь мы можем квантовать элементы нашего тензора:
result = round(input * s)
Следует обратить внимание на то, что оператор может немного скорректировать запрошенные минимальное и максимальное значения во время процесса квантования, поэтому вам всегда следует использовать выходные порты в качестве диапазона для дальнейших вычислений. Например, если запрошенные минимальное и максимальное значения близки к равным, они будут разделены небольшим значением эпсилон, чтобы предотвратить создание неправильно сформированных квантованных буферов. В противном случае вы можете получить буферы, в которых все квантованные значения сопоставляются с одним и тем же значением с плавающей запятой, что вызывает проблемы для операций, которые должны выполнять над ними дальнейшие вычисления.
Аргументы:
- область: объект области.
- min_range: минимальное скалярное значение, которое может быть получено для ввода.
- max_range: максимальное скалярное значение, которое может быть получено для ввода.
Возврат:
-
Output
вывод: квантованные данные, полученные из входного числа с плавающей запятой. -
Output
: фактическое минимальное скалярное значение, используемое для вывода. -
Output
выход_макс: фактическое максимальное скалярное значение, используемое для выхода.
Конструкторы и деструкторы | |
---|---|
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 |
Публичные статические функции | |
---|---|
Mode (StringPiece 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 Mode( StringPiece x )
Раундрежим
Attrs RoundMode( StringPiece x )