tensorflow:: ops:: QuantizeV2
#include <array_ops.h>Kwantyzuj tensor 'wejściowy' typu float na tensor 'wyjściowy' typu 'T'.
Streszczenie
[min_range, max_range] to skalarne zmiennoprzecinkowe wartości liczbowe, które określają zakres danych wejściowych. Atrybut „mode” kontroluje dokładnie, które obliczenia są używane do konwersji wartości zmiennoprzecinkowych na ich skwantyzowane odpowiedniki. Atrybut „round_mode” kontroluje, który algorytm rozstrzygania remisów jest używany podczas zaokrąglania wartości zmiennoprzecinkowych do ich skwantyzowanych odpowiedników.
W trybie „MIN_COMBINED” każda wartość tensora będzie podlegać następującym procedurom:
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
Przykład trybu MIN_COMBINED
Załóżmy, że dane wejściowe są typu float i mają możliwy zakres [0,0, 6,0], a dane wyjściowe to quint8 ([0, 255]). Wartości min_range i max_range powinny być określone jako 0,0 i 6,0. Kwantyzacja z float na quint8 spowoduje pomnożenie każdej wartości wejściowej przez 255/6 i rzutowanie na quint8.
Jeśli typ wyjściowy to qint8 ([-128, 127]), operacja dodatkowo odejmie każdą wartość o 128 przed rzutowaniem, tak aby zakres wartości był zgodny z zakresem qint8.
Jeżeli trybem jest „MIN_FIRST”, wówczas stosuje się takie 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 tą funkcją a funkcją MIN_COMBINED jest to, że zakres minimalny jest najpierw zaokrąglany, zanim zostanie odjęty od zaokrąglonej wartości. W przypadku funkcji MIN_COMBINED wprowadzane jest niewielkie odchylenie, gdzie wielokrotne iteracje kwantyzacji i dekwantyzacji będą wprowadzać coraz większy błąd.
Przykład trybu skalowanego
Tryb SCALED jest zgodny z podejściem kwantyzacji używanym w QuantizeAndDequantize{V2|V3} .
Jeśli tryb jest 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 wartości min_range i max_range tak, aby był jak największy, tak aby zakres od min_range do max_range był reprezentowalny 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 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, a 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łoby -10, ale max_range zostałoby dostosowane do 127 / 12,8 = 9,921875.
Będziemy więc kwantyzować wartości wejściowe w zakresie od (-10, 9,921875) do (-128, 127).
Tensor wejściowy można teraz skwantować, przycinając wartości do zakresu min_range do max_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)
Skorygowane min_range i max_range są zwracane jako wyniki 2 i 3 tej operacji. Wyniki te powinny być używane jako zakres do dalszych obliczeń.
atrybut narrow_range (bool)
Jeśli wartość jest prawdziwa, nie używamy minimalnej skwantyzowanej wartości. Oznacza to, że dla int8 skwantyzowane wyjście byłoby ograniczone do zakresu -127..127 zamiast pełnego zakresu -128..127. Jest to zapewnione dla 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, dzięki czemu zakresy kwantyzacji będą obliczane i stosowane osobno dla każdego wycinka tensora wzdłuż tego wymiaru. Jest to przydatne w przypadku kwantyzacji per-channel.
Jeśli określono oś, min_range i max_range
jeśli axis = None, kwantyzacja na tensor jest wykonywana normalnie.
atrybut Ensure_minimum_range (float)
Gwarantuje, że minimalny zakres kwantyzacji wynosi co najmniej tę wartość. Domyślna wartość to 0,01, ale zdecydowanie zaleca się ustawienie jej na 0 w przypadku nowych zastosowań.
Argumenty:
- zakres: obiekt zakresu
- min_range: Minimalna wartość zakresu kwantyzacji. Wartość ta może zostać dostosowana przez operatora w zależności od innych parametrów. Skorygowana wartość jest zapisywana w
output_min. Jeśli określono atrybutaxis, musi to być tensor jednowymiarowy, którego rozmiar odpowiada wymiarowiaxistensora wejściowego i wyjściowego. - max_range: Maksymalna wartość zakresu kwantyzacji. Wartość ta może zostać dostosowana przez operatora w zależności od innych parametrów. Skorygowana wartość jest zapisywana w
output_max. Jeśli określono atrybutaxis, musi to być tensor jednowymiarowy, którego rozmiar odpowiada wymiarowiaxistensora wejściowego i wyjściowego.
Zwroty:
-
Output: skwantyzowane dane wygenerowane z wejścia zmiennoprzecinkowego. -
Outputoutput_min: Minimalny końcowy zakres kwantyzacji, używany do przycinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantyzowanych. Jeśli określono atrybutaxis, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxistensora wejściowego i wyjściowego. -
Outputoutput_max: Ostateczny maksymalny zakres kwantyzacji, używany do przycinania wartości wejściowych przed skalowaniem i zaokrąglaniem ich do wartości skwantyzowanych. Jeśli określono atrybutaxis, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowiaxistensora 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:: Attrs | Opcjonalne settery atrybutów dla QuantizeV2 . |
Atrybuty publiczne
działanie
Operation operation
wyjście
::tensorflow::Output output
wyjście_max
::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ąski zakres
Attrs NarrowRange( bool x )
Tryb okrągły
Attrs RoundMode( StringPiece x )