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 „zakres (T) = limity_numeryczne ::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 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 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, 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 z 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 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)
 
Ustawione „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 „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

Smyczkowy 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>
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.
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
Powroty
  • 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)