flux tensoriel : : opérations : : QuantifierV2

#include <array_ops.h>

Quantifiez le tenseur « d'entrée » de type float en tenseur « de sortie » de type « T ».

Résumé

[min_range, max_range] sont des flottants scalaires qui spécifient la plage des données « d'entrée ». L'attribut 'mode' contrôle exactement quels calculs sont utilisés pour convertir les valeurs flottantes en leurs équivalents quantifiés. L'attribut 'round_mode' contrôle quel algorithme de départage est utilisé lors de l'arrondi des valeurs flottantes à leurs équivalents quantifiés.

En mode 'MIN_COMBINED', chaque valeur du tenseur subira les opérations suivantes :

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

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

Exemple de mode MIN_COMBINED

Supposons que l'entrée soit de type float et ait une plage possible de [0.0, 6.0] et que le type de sortie soit quint8 ([0, 255]). Les valeurs min_range et max_range doivent être spécifiées comme 0,0 et 6,0. La quantification de float à quint8 multipliera chaque valeur de l'entrée par 255/6 et sera convertie en quint8.

Si le type de sortie était qint8 ([-128, 127]), l'opération soustraira en outre chaque valeur de 128 avant la conversion, de sorte que la plage de valeurs s'aligne sur la plage de qint8.

Si le mode est « MIN_FIRST », alors cette approche est utilisée :

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

La plus grande différence entre ceci et MIN_COMBINED est que la plage minimale est d'abord arrondie, avant d'être soustraite de la valeur arrondie. Avec MIN_COMBINED, un petit biais est introduit où des itérations répétées de quantification et de déquantification introduiront une erreur de plus en plus grande.

Mode ÉCHELLE Exemple

Le mode SCALED correspond à l'approche de quantification utilisée dans QuantizeAndDequantize{V2|V3} .

Si le mode est SCALED , la quantification est effectuée en multipliant chaque valeur d'entrée par un facteur d'échelle. Le facteur d'échelle est déterminé à partir de min_range et max_range pour être aussi grand que possible, de sorte que la plage de min_range à max_range soit représentable dans les valeurs de type 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);

Nous utilisons ensuite le scale_factor pour ajuster min_range et max_range comme suit :

      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

Par exemple, si T = qint8, et initialement min_range = -10 et max_range = 9, nous comparerions -128/-10,0 = 12,8 à 127/9,0 = 14,11, et définirions scaling_factor = 12,8. Dans ce cas, min_range resterait -10, mais max_range serait ajusté à 127/12,8 = 9,921875

Nous allons donc quantifier les valeurs d'entrée comprises entre (-10, 9,921875) et (-128, 127).

Le tenseur d'entrée peut maintenant être quantifié en découpant les valeurs dans la plage min_range à max_range , puis en multipliant par scale_factor comme suit :

result = round(min(max_range, max(min_range, input)) * scale_factor)

Les min_range et max_range ajustés sont renvoyés comme sorties 2 et 3 de cette opération. Ces sorties doivent être utilisées comme plage pour tout calcul ultérieur.

Attribut étroit_range (bool)

Si c’est vrai, nous n’utilisons pas la valeur quantifiée minimale. c'est-à-dire que pour int8 la sortie quantifiée, elle serait limitée à la plage -127..127 au lieu de la plage complète -128..127. Ceci est fourni pour des raisons de compatibilité avec certains backends d’inférence. (S'applique uniquement au mode SCALED)

attribut axe (int)

Un attribut axis facultatif peut spécifier un indice de dimension du tenseur d'entrée, de sorte que les plages de quantification soient calculées et appliquées séparément pour chaque tranche du tenseur le long de cette dimension. Ceci est utile pour la quantification par canal.

Si l'axe est spécifié, min_range et max_range

si axis = Aucun, la quantification par tenseur est effectuée normalement.

Attribut Ensure_minimum_range (float)

Garantit que la plage de quantification minimale est au moins égale à cette valeur. La valeur par défaut héritée est 0,01, mais il est fortement suggéré de la définir sur 0 pour les nouvelles utilisations.

Arguments :

  • scope : un objet Scope
  • min_range : La valeur minimale de la plage de quantification. Cette valeur peut être ajustée par l'opérateur en fonction d'autres paramètres. La valeur ajustée est écrite dans output_min . Si l'attribut axis est spécifié, il doit s'agir d'un tenseur 1D dont la taille correspond à la dimension de l' axis des tenseurs d'entrée et de sortie.
  • max_range : La valeur maximale de la plage de quantification. Cette valeur peut être ajustée par l'op en fonction d'autres paramètres. La valeur ajustée est écrite dans output_max . Si l'attribut axis est spécifié, il doit s'agir d'un tenseur 1D dont la taille correspond à la dimension de l' axis des tenseurs d'entrée et de sortie.

Retours :

  • Sortie Output : les données quantifiées produites à partir de l'entrée flottante.
  • Output output_min : le minimum de la plage de quantification finale, utilisée pour découper les valeurs d'entrée avant de les mettre à l'échelle et de les arrondir aux valeurs quantifiées. Si l'attribut axis est spécifié, il s'agira d'un tenseur 1D dont la taille correspond à la dimension de l' axis des tenseurs d'entrée et de sortie.
  • Output output_max : le maximum de la plage de quantification finale, utilisée pour découper les valeurs d'entrée avant de les mettre à l'échelle et de les arrondir aux valeurs quantifiées. Si l'attribut axis est spécifié, il s'agira d'un tenseur 1D dont la taille correspond à la dimension de l' axis des tenseurs d'entrée et de sortie.

Constructeurs et Destructeurs

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)

Attributs publics

operation
output
output_max
output_min

Fonctions statiques publiques

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool x)
RoundMode (StringPiece x)

Structures

tensorflow :: ops :: QuantizeV2 :: Attrs

Setters d'attributs facultatifs pour QuantizeV2 .

Attributs publics

opération

Operation operation

sortir

::tensorflow::Output output

sortie_max

::tensorflow::Output output_max

sortie_min

::tensorflow::Output output_min

Fonctions publiques

QuantifierV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

QuantifierV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

Fonctions statiques publiques

Axe

Attrs Axis(
  int64 x
)

Assurer la plage minimale

Attrs EnsureMinimumRange(
  float x
)

Mode

Attrs Mode(
  StringPiece x
)

Plage étroite

Attrs NarrowRange(
  bool x
)

Mode rond

Attrs RoundMode(
  StringPiece x
)