tensorflow :: ops :: QuantizeV2
#include <array_ops.h>
Kwantyzuj tensor „wejściowy” typu zmiennoprzecinkowego do tensora „wyjściowego” typu „T”.
Podsumowanie
[min_range, max_range] to liczby zmiennoprzecinkowe skalarne, które określają zakres danych wejściowych. Atrybut „tryb” dokładnie określa, które obliczenia są używane do konwersji wartości zmiennoprzecinkowych na ich skwantyzowane odpowiedniki. Atrybut „round_mode” kontroluje, który algorytm zaokrąglania łamania równości jest używany podczas zaokrąglania wartości zmiennoprzecinkowych do ich skwantyzowanych odpowiedników.
W trybie „MIN_COMBINED” każda wartość tensora ulegnie następującym zmianom:
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 pomnoży każdą wartość wejścia przez 255/6 i rzuci na quint8.
Jeśli typem wyjściowym był qint8 ([-128, 127]), operacja dodatkowo odejmie każdą wartość o 128 przed rzutowaniem, tak aby zakres wartości był zgodny z zakresem qint8.
Jeśli tryb to „MIN_FIRST”, stosuje się 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 zakres minimalny jest najpierw zaokrąglany, a dopiero potem odejmowany od zaokrąglonej wartości. W przypadku MIN_COMBINED wprowadzane jest niewielkie odchylenie, w którym powtarzane iteracje kwantyzacji i dekwantyzacji wprowadzą coraz większy błąd.
Tryb SKALOWANY Przykład
Tryb SCALED
odpowiada podejściu kwantyzacji QuantizeAndDequantize{V2|V3}
w QuantizeAndDequantize{V2|V3}
.
Jeśli tryb to SCALED
, kwantyzacja jest wykonywana przez pomnożenie każdej wartości wejściowej przez scaling_factor. Scaling_factor jest określany z wartości min_range
i max_range
aby był jak największy, tak aby zakres od min_range
do max_range
był reprezentowany w ramach wartości 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 scale_factor, 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, a max_range = 9, porównalibyśmy -128 / -10,0 = 12,8 do 127 / 9,0 = 14,11 i ustawili scaling_factor = 12,8 W tym przypadku min_range pozostałby -10, ale max_range zostanie dostosowany do 127 / 12,8 = 9,921875
Zatem kwantyzujemy wartości wejściowe w zakresie od (-10, 9,921875) do (-128, 127).
Tensor wejściowy można teraz kwantyzować, przycinając wartości do zakresu
min_range
domax_range
, a następnie mnożąc przez scale_factor w następujący sposób:
result = round(min(max_range, max(min_range, input)) * scale_factor)Dostosowane wartości
min_range
imax_range
są zwracane jako wyjścia 2 i 3 tej operacji. Te dane wyjściowe powinny być używane jako zakres do dalszych obliczeń.atrybut narrow_range (bool)
Jeśli prawda, nie używamy minimalnej skwantowanej wartości. tzn. dla int8 kwantowane wyjście byłoby ograniczone do zakresu -127..127 zamiast pełnego zakresu -128..127. Jest to zapewniane w celu zapewnienia zgodności z niektórymi backendami 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 do kwantyzacji na kanał.Jeśli określono oś, min_range i max_range
jeśli
axis
= None, kwantyzacja na tensor jest wykonywana normalnie.atrybut zapewnienia_minimum_zakresu (zmiennoprzecinkowy)
Zapewnia, że minimalny zakres kwantyzacji wynosi co najmniej tę wartość. Starsza domyślna wartość to 0,01, ale zdecydowanie zaleca się ustawienie jej na 0 do nowych zastosowań.
Argumenty:
- zakres: obiekt Scope
- min_range: minimalna wartość zakresu kwantyzacji. Ta wartość może być regulowana przez op w zależności od innych parametrów.
output_min
wartość jest zapisywana woutput_min
. Jeśli atrybutaxis
jest określony, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowych i wyjściowych. - max_range: maksymalna wartość zakresu kwantyzacji. Ta wartość może być regulowana przez op w zależności od innych parametrów.
output_max
wartość jest zapisywana woutput_max
. Jeśli atrybutaxis
jest określony, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowych i wyjściowych.
Zwroty:
-
Output
wyjściowe: skwantowane dane wygenerowane z wejścia typu float. -
Output
output_min: Ostateczny minimalny zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli atrybutaxis
jest określony, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowych i wyjściowych. -
Output
output_max: ostateczny maksymalny zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do skwantowanych wartości. Jeśli atrybutaxis
jest określony, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowych i wyjściowych.
Konstruktorzy i niszczyciele | |
---|---|
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 :: Attrs | Opcjonalne metody ustawiające atrybuty dla QuantizeV2 . |
Atrybuty publiczne
operacja
Operation operation
wynik
::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
Oś
Attrs Axis( int64 x )
ZapewnijMinimumRange
Attrs EnsureMinimumRange( float x )
Tryb
Attrs Mode( StringPiece x )
Wąski zakres
Attrs NarrowRange( bool x )
RoundMode
Attrs RoundMode( StringPiece x )