Merken Sie den Termin vor! Google I / O kehrt vom 18. bis 20. Mai zurück Registrieren Sie sich jetzt
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Tensorflow :: ops :: QuantizeV2

#include <array_ops.h>

Quantisieren Sie den 'Input'-Tensor vom Typ float zum' Output'-Tensor vom Typ 'T'.

Zusammenfassung

[min_range, max_range] sind skalare Floats, die den Bereich für die 'Eingabedaten' angeben. Das Attribut 'mode' steuert genau, welche Berechnungen verwendet werden, um die Gleitkommawerte in ihre quantisierten Äquivalente umzuwandeln. Das Attribut 'round_mode' steuert, welcher Algorithmus zum Brechen von Rundungsbindungen verwendet wird, wenn Float-Werte auf ihre quantisierten Äquivalente gerundet werden.

Im Modus 'MIN_COMBINED' wird jeder Wert des Tensors wie folgt durchlaufen:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0

hier range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min()

Beispiel für den MIN_COMBINED-Modus

Angenommen, die Eingabe ist vom Typ float und hat einen möglichen Bereich von [0.0, 6.0] und der Ausgabetyp ist quint8 ([0, 255]). Die Werte für min_range und max_range sollten als 0.0 und 6.0 angegeben werden. Durch Quantisieren von float zu quint8 wird jeder Wert der Eingabe mit 255/6 multipliziert und in quint8 umgewandelt.

Wenn der Ausgabetyp qint8 ([-128, 127]) war, subtrahiert die Operation vor dem Umwandeln zusätzlich jeden Wert um 128, sodass der Wertebereich mit dem Bereich von qint8 übereinstimmt.

Wenn der Modus 'MIN_FIRST' ist, wird dieser Ansatz verwendet:

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

Der größte Unterschied zwischen diesem und MIN_COMBINED besteht darin, dass der Mindestbereich zuerst gerundet wird, bevor er vom gerundeten Wert abgezogen wird. Mit MIN_COMBINED wird eine kleine Vorspannung eingeführt, bei der wiederholte Iterationen des Quantisierens und Dequantisierens einen immer größeren Fehler verursachen.

Beispiel für den skalierten Modus

SCALED Modus entspricht dem in QuantizeAndDequantize{V2|V3} verwendeten QuantizeAndDequantize{V2|V3} .

Wenn der Modus SCALED , verwenden wir nicht den gesamten Bereich des Ausgabetyps und wählen den niedrigstmöglichen Wert für die Symmetrie (z. B. der Ausgabebereich ist -127 bis 127, nicht -128 bis 127 für die vorzeichenbehaftete 8-Bit-Quantisierung). so dass 0.0 auf 0 abgebildet wird.

Den Wertebereich finden wir zunächst in unserem Tensor. Der Bereich, den wir verwenden, ist immer auf 0 zentriert, also finden wir m so, dass

  m = max(abs(input_min), abs(input_max))

Unser Eingangstensorbereich ist dann [-m, m] .

Als nächstes wählen wir unsere Festpunkt-Quantisierungs-Buckets [min_fixed, max_fixed] . Wenn T signiert ist, ist dies

  num_bits = sizeof(T) * 8
  [min_fixed, max_fixed] =
      [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]

Andernfalls ist der Festpunktbereich, wenn T ohne Vorzeichen ist

  [min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

Daraus berechnen wir unseren Skalierungsfaktor s:

  s = (max_fixed - min_fixed) / (2 * m)

Jetzt können wir die Elemente unseres Tensors quantisieren:

result = round(input * s)

Eine Sache, auf die Sie achten müssen, ist, dass der Bediener die angeforderten Minimal- und Maximalwerte während des Quantisierungsprozesses geringfügig anpassen kann. Daher sollten Sie immer die Ausgangsports als Bereich für weitere Berechnungen verwenden. Wenn beispielsweise die angeforderten Minimal- und Maximalwerte nahezu gleich sind, werden sie durch einen kleinen Epsilon-Wert getrennt, um zu verhindern, dass schlecht geformte quantisierte Puffer erstellt werden. Andernfalls können Puffer entstehen, in denen alle quantisierten Werte demselben Gleitkommawert zugeordnet sind. Dies führt zu Problemen bei Operationen, für die weitere Berechnungen erforderlich sind.

Argumente:

  • scope: Ein Scope- Objekt
  • min_range: Der minimale Skalarwert, der möglicherweise für die Eingabe erzeugt wird.
  • max_range: Der maximale Skalarwert, der möglicherweise für die Eingabe erzeugt wird.

Kehrt zurück:

  • Output Ausgabe: Die quantisierten Daten, die aus der Float-Eingabe erzeugt werden.
  • Output output_min: Der tatsächliche minimale Skalarwert, der für die Ausgabe verwendet wird.
  • Output output_max: Der tatsächliche maximale Skalarwert, der für die Ausgabe verwendet wird.

Konstruktoren und Destruktoren

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)

Öffentliche Attribute

operation
output
output_max
output_min

Öffentliche statische Funktionen

Mode (StringPiece x)
RoundMode (StringPiece x)

Strukturen

tensorflow :: ops :: QuantizeV2 :: Attrs

Optionale Attributsetzer für QuantizeV2 .

Öffentliche Attribute

Operation

Operation operation

Ausgabe

::tensorflow::Output output

output_max

::tensorflow::Output output_max

output_min

::tensorflow::Output output_min

Öffentliche Funktionen

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
)

Öffentliche statische Funktionen

Modus

Attrs Mode(
  StringPiece x
)

RoundMode

Attrs RoundMode(
  StringPiece x
)