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_numerycznePrzykł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,921875Zatem 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ś (oś długa) |
statyczny <T rozszerza TType > Kwantyzacja <T> | |
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
Metody publiczne
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
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.