tf.raw_ops.QuantizeAndDequantizeV2
Квантует, а затем деквантует тензор.
tf.raw_ops.QuantizeAndDequantizeV2(
input,
input_min,
input_max,
signed_input=True,
num_bits=8,
range_given=False,
round_mode='HALF_TO_EVEN',
narrow_range=False,
axis=-1,
name=None
)
Этот оператор имитирует потерю точности при квантованном прямом проходе, выполнив:
- Квантование тензора до чисел с фиксированной точкой, которое должно соответствовать целевому методу квантования при использовании в выводе.
- Деквантование его обратно в числа с плавающей точкой для последующих операций, скорее всего, matmul.
Существует несколько способов квантования. Этот вариант использует только масштабирование, поэтому 0.0 отображается в 0.
Из указанного значения 'num_bits' в типе квантованного вывода определяется минимальное и максимальное представимые квантованные значения.
Например:
- [-128, 127] для знакового, num_bits = 8, или
- [0, 255] для беззнакового, num_bits = 8.
Если range_given == False, начальные input_min, input_max будут определены автоматически как минимальное и максимальное значения в тензоре, в противном случае используются указанные значения input_min, input_max.
Примечание: Если input_min, input_max указаны, они не обязательно должны быть равны фактическим минимальному и максимальному значениям в тензоре. Например, в некоторых случаях может быть полезно указать эти значения таким образом, чтобы низковероятные крайние значения входного распределения обрезались.
Этот оператор определяет максимальный масштабный множитель, который отобразит начальный диапазон [input_min, input_max] в диапазон, который находится в пределах представимого квантованного диапазона.
Он определяет масштаб по одному из input_min и input_max, затем обновляет другой, чтобы максимизировать представимый диапазон.
Например:
- если выходной сигнал знаковый, num_bits = 8, [input_min, input_max] = [-10.0, 5.0]: он будет использовать масштабный множитель -128 / -10.0 = 12.8 В этом случае он обновит input_max до 127 / 12.8 = 9.921875
- если выходной сигнал знаковый, num_bits = 8, [input_min, input_max] = [-10.0, 10.0]: он будет использовать масштабный множитель 127 / 10.0 = 12.7 В этом случае он обновит input_min до 128.0 / 12.7 = -10.07874
- если выходной сигнал беззнаковый, input_min принудительно устанавливается в 0, и используется только указанное input_max.
После определения масштабного множителя и обновления диапазона входных данных он применяет следующее к каждому значению в тензоре 'input'.
output = round(clamp(value, input_min, input_max) * scale_factor) / scale_factor.
Функция round выше округляет значение в соответствии с заданным round_mode.
| Аргументы | |
|---|---|
input | A Tensor. Должен быть одним из следующих типов: bfloat16, half, float32, float64. Тензор для квантования и последующего деквантования. |
input_min | A Tensor. Должен иметь тот же тип, что и input. Если range_given == True, это задает минимальное значение входных данных, которое необходимо представить, в противном случае определяется из минимального значения тензора input. |
input_max | A Tensor. Должен иметь тот же тип, что и input. Если range_given == True, это задает максимальное значение входных данных, которое необходимо представить, в противном случае определяется из максимального значения тензора input. |
signed_input | Необязательный bool. По умолчанию True. Указывает, является ли квантование знаковым или беззнаковым. (на самом деле этот параметр должен был называться signed_output) |
num_bits | Необязательный int. По умолчанию 8. Разрядность квантования. |
range_given | Необязательный bool. По умолчанию False. Указывает, задан ли диапазон или должен быть определён из тензора input. |
round_mode | Необязательный string из: "HALF_TO_EVEN", "HALF_UP". По умолчанию "HALF_TO_EVEN". Атрибут 'round_mode' контролирует, какой алгоритм округления используется при округление чисел с плавающей точкой до их квантованных эквивалентов. В настоящее время поддерживаются следующие режимы округления:
|
narrow_range | Необязательный bool. По умолчанию False. Если True, абсолютное значение минимального квантованного значения совпадает с максимальным квантованным значением, а не на 1 больше. Т.е. для 8-битного квантования минимальное значение равно -127, а не -128. |
axis | Необязательный int. По умолчанию -1. Если указано, эта ось обрабатывается как ось канала или среза, и для каждого канала или среза вдоль этой оси используется отдельный диапазон квантования. |
name | Название операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor. Имеет тот же тип, что и input. |
© 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/python/tf/raw_ops/QuantizeAndDequantizeV2