tf.quantization.dequantize
Деквантизуйте тензор «input» в тензор с плавающей запятой.
tf.quantization.dequantize(
input, min_range, max_range, mode='MIN_COMBINED', name=None
)
[min_range, max_range] — скалярные числа с плавающей запятой, которые задают диапазон для данных «input». Атрибут «mode» управляет тем, какие именно вычисления используются для преобразования значений с плавающей запятой в их квантованные эквиваленты.
В режиме «MIN_COMBINED» каждое значение тензора претерпевает следующее:
if T == qint8: in[i] += (range(T) + 1)/ 2.0 out[i] = min_range + (in[i]* (max_range - min_range) / range(T))
здесь range(T) = numeric_limits<T>::max() - numeric_limits<T>::min()
Пример режима MIN_COMBINED
Если вход поступает из QuantizedRelu6, тип выходного значения — quint8 (диапазон 0-255), но возможный диапазон QuantizedRelu6 — 0-6. Значения min_range и max_range, следовательно, равны 0,0 и 6,0. При деквантизации quint8 каждое значение преобразуется в число с плавающей запятой и умножается на 6 / 255. Обратите внимание, что если quantizedtype — qint8, операция дополнительно прибавляет к каждому значению 128 до преобразования в число с плавающей запятой.
Если режим — «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 = range / num_discrete_values const double offset_input = static_cast<double>(input) - lowest_quantized; result = range_min + ((input - numeric_limits<T>::min()) * range_scale)
Пример режима 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 = (2 * m) / (max_fixed - min_fixed)
Теперь мы можем деквантизовать элементы нашего тензора:
result = input * s
| Аргументы | |
|---|---|
input | A Tensor. Должен быть одного из следующих типов: qint8, quint8, qint32, qint16, quint16. |
min_range | A Tensor типа float32. Минимальное скалярное значение, которое может быть получено для входа. |
max_range | A Tensor типа float32. Максимальное скалярное значение, которое может быть получено для входа. |
mode | Необязательный string из: "MIN_COMBINED", "MIN_FIRST", "SCALED". По умолчанию "MIN_COMBINED". |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
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/dequantize