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
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())
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);
min_range = min_T / scale_factor;
max_range = max_T / scale_factor;
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)
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> | 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
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.