Quantize

publiczne zajęcia końcowe Quantize

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

[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() - limity_numeryczne ::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<T>::min()
 quantized = max(quantized, numeric_limits<T>::min())
 quantized = min(quantized, numeric_limits<T>::max())
 
Największą różnicą między tym a MIN_COMBINED jest to, że najpierw zaokrąglany jest minimalny zakres, a następnie odejmowany 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 zastosowanemu w `QuantizeAndDequantize{V2|V3}`.

Jeśli tryb to „SKALOWANY”, 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<T>::min();
   const int max_T = std::numeric_limits<T>::max();
   const float max_float = std::numeric_limits<float>::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 do dostosowania minimalnego zakresu 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 skwantyzować, przycinając wartości do zakresu od „min_zakres” do „maksymalny_zakres”, 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)
 
Dostosowane „min_zakres” i „maksymalny_zakres” są zwracane jako wyniki 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 „oś” = 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ń.

Klasy zagnieżdżone

klasa Kwantyzacja.Opcje Opcjonalne atrybuty Quantize

Stałe

Strunowy OP_NAME Nazwa tej operacji znana silnikowi rdzenia TensorFlow

Metody publiczne

statyczna kwantyzacja.Opcje
(oś długa)
statyczny <T rozszerza TType > Kwantyzacja <T>
utwórz (zakres zakresu , Operand < TFloat32 > wejście, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Opcje... opcje)
Metoda fabryczna służąca do tworzenia klasy opakowującej nową operację kwantyzacji.
statyczna kwantyzacja.Opcje
zapewnieniaMinimumRange (Float zapewnieniaMinimumRange)
statyczna kwantyzacja.Opcje
tryb (tryb ciągowy)
statyczna kwantyzacja.Opcje
wąski zakres (Boolean wąski zakres)
Wyjście <T>
wyjście ()
Skwantowane dane generowane na podstawie sygnału wejściowego typu float.
Dane wyjściowe <TFloat32>
moc wyjściowaMaks. ()
Maksimum końcowego zakresu kwantyzacji, używane do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych.
Dane wyjściowe <TFloat32>
moc wyjściowaMin ()
Minimum końcowego zakresu kwantyzacji, używane do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych.
statyczna kwantyzacja.Opcje
roundMode (String roundMode)

Metody dziedziczone

Stałe

publiczny statyczny końcowy ciąg znaków OP_NAME

Nazwa tej operacji znana silnikowi rdzenia TensorFlow

Wartość stała: „QuantizeV2”

Metody publiczne

publiczna statyczna Quantize.Options (oś długa)

public static Quantize <T> create (Zakres zakresu , Operand < TFloat32 > wejście, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Opcje... opcje)

Metoda fabryczna służąca do tworzenia klasy opakowującej nową operację kwantyzacji.

Parametry
zakres aktualny zakres
minZakres 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 „oś”, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi „osi” tensorów wejściowego i wyjściowego.
Maks.Zakres 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 „oś”, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi „osi” tensorów wejściowego i wyjściowego.
opcje przenosi opcjonalne wartości atrybutów
Zwroty
  • nowa instancja Quantize

public static Quantize.Options zapewnij minimalny zakres (Float zapewnij minimalny zakres)

publiczny tryb statyczny Quantize.Options (tryb String)

public static Quantize.Options wąskiRange (Boolean wąskiRange)

publiczne wyjście <T> wyjście ()

Skwantowane dane generowane na podstawie sygnału wejściowego typu float.

publiczne wyjście < TFloat32 > wyjścieMax ()

Maksimum końcowego zakresu kwantyzacji, używane do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybut „oś”, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi „osi” tensorów wejściowego i wyjściowego.

publiczne wyjście < TFloat32 > wyjścieMin ()

Minimum końcowego zakresu kwantyzacji, używane do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybut „oś”, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi „osi” tensorów wejściowego i wyjściowego.

public static Quantize.Options roundMode (String roundMode)