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 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)

Dostosowane wartości min_range i max_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 atrybut axis jest określony, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi axis 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 w output_max . Jeśli atrybut axis jest określony, musi to być tensor 1-D, którego rozmiar odpowiada wymiarowi axis 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 atrybut axis jest określony, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis 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 atrybut axis jest określony, będzie to tensor 1-D, którego rozmiar odpowiada wymiarowi axis 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

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
)