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 ::max() - numeric_limits ::min()

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 atrybut axis , musi to być tensor jednowymiarowy, którego rozmiar odpowiada wymiarowi axis tensora 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 atrybut axis , musi to być tensor jednowymiarowy, którego rozmiar odpowiada wymiarowi axis tensora wejściowego i wyjściowego.

Zwroty:

  • Output : skwantyzowane dane wygenerowane z wejścia zmiennoprzecinkowego.
  • Output output_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 atrybut axis , będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensora wejściowego i wyjściowego.
  • Output output_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 atrybut axis , będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis tensora 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
)