tensorflow :: ops :: QuantizeV2
#include <array_ops.h>
Kwantyzuj tensor „wejściowy” typu zmiennoprzecinkowego do tensora „wyjściowego” typu „T”.
streszczenie
[min_range, max_range] to liczby zmiennoprzecinkowe skalarne, które określają zakres danych wejściowych. Atrybut „mode” 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”, 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::min() quantized = max(quantized, numeric_limits ::min()) quantized = min(quantized, numeric_limits ::max())
Największa różnica między tym a MIN_COMBINED polega na tym, że zakres minimalny jest najpierw zaokrąglany, a dopiero potem odejmowany od zaokrąglonej wartości. Przy 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
pasuje do metody kwantyzacji używanej w QuantizeAndDequantize{V2|V3}
.
Jeśli tryb jest 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 od
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. tj. 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 systemami 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.zapewnić atrybut zakresu minimalnego (float)
Zapewnia, że minimalny zakres kwantyzacji ma co najmniej tę wartość. Starsza wartość domyślna 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. Dostosowana wartość jest zapisywana w
output_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 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. -
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 )