tensorflow:: ops:: QuantizeV2
#include <array_ops.h>
Kwantyzuj tensor „wejściowy” typu float do tensora „wyjściowego” typu „T”.
Streszczenie
[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 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 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::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 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 stosowanemu w QuantizeAndDequantize{V2|V3}
.
Jeśli tryb to SCALED
, 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::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 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 do 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
min_range
domax_range
, 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)Skorygowany
min_range
imax_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
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
axis
= 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ń.
Argumenty:
- zakres: Obiekt Scope
- min_range: 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 atrybutaxis
, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowego i wyjściowego. - max_range: 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 atrybutaxis
, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowego i wyjściowego.
Zwroty:
- Wyjście
Output
: skwantowane dane generowane z wejścia pływakowego. -
Output
Output_min: Minimalny końcowy zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybutaxis
, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowego i wyjściowego. -
Output
Output_max: Maksymalny końcowy zakres kwantyzacji, używany do obcinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantowanych. Jeśli określono atrybutaxis
, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxis
tensorów wejściowego i wyjściowego.
Konstruktory i destruktory | |
---|---|
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:: Atrybuty | Opcjonalne narzędzia ustawiające atrybuty dla QuantizeV2 . |
Atrybuty publiczne
działanie
Operation operation
wyjście
::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 )
Zapewnij minimalny zakres
Attrs EnsureMinimumRange( float x )
Tryb
Attrs Mode( StringPiece x )
WąskiZakres
Attrs NarrowRange( bool x )
Tryb okrągły
Attrs RoundMode( StringPiece x )