Quantize

classe finale publique Quantifier

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

[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 éléments suivants :

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() - limites_numériques ::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<T>::min()
 quantized = max(quantized, numeric_limits<T>::min())
 quantized = min(quantized, numeric_limits<T>::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<T>::min();
   const int max_T = std::numeric_limits<T>::max();
   const float max_float = std::numeric_limits<float>::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 facultatif « axis » peut spécifier un indice de dimension du tenseur d'entrée, de telle sorte que les plages de quantification seront 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`=None, 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.

Classes imbriquées

classe Quantifier.Options Attributs facultatifs pour Quantize

Constantes

Chaîne OP_NAME Le nom de cette opération, tel que connu par le moteur principal TensorFlow

Méthodes publiques

Options de quantification statique
axe (axe long)
statique <T étend TType > Quantize <T>
créer ( Scope scope, Operand < TFloat32 > input, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Options... options)
Méthode d'usine pour créer une classe encapsulant une nouvelle opération Quantize.
Options de quantification statique
assurerMinimumRange (Float assurerMinimumRange)
Options de quantification statique
mode (mode chaîne)
Options de quantification statique
étroitRange (booléen étroitRange)
Sortie <T>
sortir ()
Les données quantifiées produites à partir de l’entrée float.
Sortie < TFloat32 >
sortieMax ()
La plage de quantification maximale 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.
Sortie < TFloat32 >
sortieMin ()
Le minimum de la plage de quantification finale, utilisé pour découper les valeurs d'entrée avant de les mettre à l'échelle et de les arrondir aux valeurs quantifiées.
Options de quantification statique
roundMode (Chaîne roundMode)

Méthodes héritées

Constantes

chaîne finale statique publique OP_NAME

Le nom de cette opération, tel que connu par le moteur principal TensorFlow

Valeur constante : "QuantizeV2"

Méthodes publiques

axe public static Quantize.Options (axe long)

public static Quantize <T> create ( Scope scope, Operand < TFloat32 > input, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Options... options)

Méthode d'usine pour créer une classe encapsulant une nouvelle opération Quantize.

Paramètres
portée portée actuelle
plagemin 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 « axis » des tenseurs d'entrée et de sortie.
plagemax La valeur maximale 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_max`. Si l'attribut « axis » est spécifié, il doit s'agir d'un tenseur 1D dont la taille correspond à la dimension « axis » des tenseurs d'entrée et de sortie.
choix porte des valeurs d'attributs facultatifs
Retour
  • une nouvelle instance de Quantize

public static Quantize.Options assureMinimumRange (Float assureMinimumRange)

Mode Quantize.Options statique public (mode String)

public static Quantize.Options étroitRange (booléen étroitRange)

sortie publique <T> sortie ()

Les données quantifiées produites à partir de l’entrée float.

Sortie publique < TFloat32 > sortieMax ()

La plage de quantification maximale 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 « axis » des tenseurs d'entrée et de sortie.

Sortie publique < TFloat32 > sortieMin ()

Le minimum de la plage de quantification finale, utilisé 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 « axis » des tenseurs d'entrée et de sortie.

public static Quantize.Options roundMode (String roundMode)