przepływ tensorowy:: ops:: QuantizeV2

#include <array_ops.h>

Kwantyzuj tensor „wejściowy” typu float do tensora „wyjściowego” typu „T”.

Streszczenie

[min_range, max_range] to skalarne liczby zmiennoprzecinkowe, które określają zakres danych „wejściowych”. Atrybut „mode” dokładnie kontroluje, które obliczenia są używane do konwersji wartości zmiennoprzecinkowych na ich skwantowane odpowiedniki. Atrybut „round_mode” kontroluje, który algorytm zaokrąglania rozstrzygania remisów jest używany podczas zaokrąglania wartości zmiennoprzecinkowych do ich skwantowanych odpowiedników.

W trybie „MIN_COMBINED” każda wartość tensora zostanie poddana następującym czynnościom:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0

tutaj range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min()

Przykład trybu MIN_COMBINED

Załóżmy, że wejście jest typu float i ma możliwy zakres [0,0, 6,0], a typ wyjścia to quint8 ([0, 255]). Wartości min_range i max_range należy określić jako 0,0 i 6,0. Kwantyzacja od float do quint8 spowoduje pomnożenie każdej wartości wejściowej przez 255/6 i rzutowanie do quint8.

Jeśli typem wyniku był qint8 ([-128, 127]), operacja dodatkowo odejmie każdą wartość o 128 przed rzutowaniem, tak aby zakres wartości pokrywał się z zakresem qint8.

Jeśli tryb to „MIN_FIRST”, stosowane jest następujące podejście:

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())

Największą różnicą między tym a MIN_COMBINED jest to, że minimalny zakres jest najpierw zaokrąglany, a następnie odjęty od zaokrąglonej wartości. W przypadku MIN_COMBINED wprowadzane jest małe odchylenie, w którym powtarzane iteracje kwantyzacji i dekwantyzacji będą wprowadzać coraz większy błąd.

Tryb SKALOWANY Przykład

Tryb SCALED odpowiada podejściu kwantyzacji stosowanemu w QuantizeAndDequantize{V2|V3} .

Jeśli tryb to SCALED , kwantyzacja jest wykonywana poprzez pomnożenie każdej wartości wejściowej przez współczynnik skalowania. Współczynnik skalowania jest określany na podstawie min_range i max_range tak, aby był jak największy, tak aby zakres od min_range do max_range był reprezentowany w wartościach typu T.

  

  const int min_T = std::numeric_limits::min();
  const int max_T = std::numeric_limits::max();
  const float max_float = std::numeric_limits::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);

Następnie używamy współczynnika skali, aby dostosować min_range i max_range w następujący sposób:

      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

np. jeśli T = qint8 i początkowo min_range = -10 i max_range = 9, porównalibyśmy -128/-10,0 = 12,8 do 127/9,0 = 14,11 i ustawiliśmy współczynnik skalowania = 12,8. W tym przypadku min_range pozostanie -10, ale max_range zostanie dostosowany do 127/12,8 = 9,921875

Zatem będziemy kwantyzować wartości wejściowe w zakresie (-10, 9,921875) do (-128, 127).

Tensor wejściowy można teraz skwantować, przycinając wartości do zakresu min_range do max_range , a następnie mnożąc przez współczynnik skali w następujący sposób:

result = round(min(max_range, max(min_range, input)) * scale_factor)

Skorygowany min_range i max_range są zwracane jako wyjścia 2 i 3 tej operacji. Wyniki te należy wykorzystać jako zakres do dalszych obliczeń.

atrybut wąskiego zakresu (bool).

Jeśli to prawda, nie używamy minimalnej wartości skwantowanej. tj. dla int8 skwantowane wyjście byłoby ograniczone do zakresu -127..127 zamiast pełnego zakresu -128..127. Zapewnia to zgodność z niektórymi narzędziami wnioskowania. (Dotyczy tylko trybu SKALOWANEGO)

atrybut osi (int).

Opcjonalny atrybut axis może określać indeks wymiaru tensora wejściowego, tak że zakresy kwantyzacji będą obliczane i stosowane oddzielnie dla każdego wycinka tensora wzdłuż tego wymiaru. Jest to przydatne w przypadku kwantyzacji na kanał.

Jeśli określono oś, min_range i max_range

jeśli axis = Brak, kwantyzacja na tensor jest wykonywana normalnie.

atrybut zapewnienia_minimum_zakresu (float).

Zapewnia, że ​​minimalny zakres kwantyzacji wynosi co najmniej tę wartość. Starsza wartość domyślna to 0,01, ale zdecydowanie zaleca się ustawienie jej na 0 w przypadku nowych zastosowań.

Argumenty:

  • zakres: Obiekt Scope
  • min_range: Minimalna wartość zakresu kwantyzacji. Wartość ta może być regulowana przez operatora w zależności od innych parametrów. Ustawiona wartość jest zapisywana w output_min . Jeśli określono atrybut axis , musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensorów wejściowego i wyjściowego.
  • max_range: Maksymalna wartość zakresu kwantyzacji. Wartość ta może być regulowana przez operatora w zależności od innych parametrów. Ustawiona wartość jest zapisywana w output_max . Jeśli określono atrybut axis , musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensorów wejściowego i wyjściowego.

Zwroty:

  • Wyjście Output : skwantowane dane generowane z wejścia pływakowego.
  • Output Output_min: Minimalny końcowy zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybut axis , będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensorów wejściowego i wyjściowego.
  • Output Output_max: Maksymalny końcowy zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybut axis , będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensorów wejściowego i wyjściowego.

Konstruktory i destruktory

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)

Atrybuty publiczne

operation
output
output_max
output_min

Publiczne funkcje statyczne

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool x)
RoundMode (StringPiece x)

Struktury

tensorflow:: ops:: QuantizeV2:: Atrybuty

Opcjonalne narzędzia ustawiające atrybuty dla QuantizeV2 .

Atrybuty publiczne

operacja

Operation operation

wyjście

::tensorflow::Output output

wyjście_maks

::tensorflow::Output output_max

wyjście_min

::tensorflow::Output output_min

Funkcje publiczne

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

Publiczne funkcje statyczne

Attrs Axis(
  int64 x
)

Zapewnij minimalny zakres

Attrs EnsureMinimumRange(
  float x
)

Tryb

Attrs Mode(
  StringPiece x
)

Wąski zakres

Attrs NarrowRange(
  bool x
)

Tryb okrągły

Attrs RoundMode(
  StringPiece x
)