Spec-Zone.ru › TensorFlow 1.15

tf.quantization.quantize

Просмотреть исходный код на GitHub

Квантует тензор 'input' типа float в тензор 'output' типа 'T'.

Псевдонимы

Основные псевдонимы

`tf.quantize`

Псевдонимы для миграции

См. руководство по миграции для получения дополнительной информации.

tf.compat.v1.quantization.quantize, tf.compat.v1.quantize, `tf.compat.v2.quantization.quantize`

tf.quantization.quantize(
    input, min_range, max_range, T, mode='MIN_COMBINED',
    round_mode='HALF_AWAY_FROM_ZERO', name=None
)

[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, мы не используем весь диапазон типа вывода, выбирая исключить наименьшее возможное значение для симметрии (например, диапазон вывода — от -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)

Следует учитывать, что оператор может выбрать немного скорректировать запрошенные минимальное и максимальное значения во время процесса квантования, поэтому вы всегда должны использовать выходные порты в качестве диапазона для дальнейших вычислений. Например, если запрошенные минимальное и максимальное значения близки друг к другу, они будут разделены небольшим значением epsilon, чтобы предотвратить создание некорректных квантованных буферов. В противном случае вы можете получить буферы, где все квантованные значения отображаются на одно и то же значение с плавающей точкой, что создает проблемы для операций, которые должны выполнять дальнейшие вычисления с ними.

Аргументы
input A Tensor типа float32.
min_range A Tensor типа float32. Минимальное скалярное значение, которое, возможно, будет получено для входа.
max_range A Tensor типа float32. Максимальное скалярное значение, которое, возможно, будет получено для входа.
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".
name Имя операции (необязательно).
Возвращаемые значения
Кортеж объектов Tensor (output, output_min, output_max).
output A Tensor типа T.
output_min A Tensor типа float32.
output_max A Tensor типа float32.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/quantization/quantize

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API