tensorflow :: opérations :: QuantizeV2
#include <array_ops.h>
Quantifier le tenseur «entrée» de type float en tenseur «sortie» de type «T».
Résumé
[min_range, max_range] sont des flottants scalaires qui spécifient la plage pour les 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 d'arrondi de départage est utilisé pour arrondir les valeurs flottantes à leurs équivalents quantifiés.
En mode 'MIN_COMBINED', chaque valeur du tenseur subira ce qui suit:
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 est de type float et a une plage possible de [0,0, 6,0] et que le type de sortie est 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 en quint8 multipliera chaque valeur de l'entrée par 255/6 et transtypera 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 arrondie en premier, 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.
Exemple de mode SCALED
SCALED
mode SCALED
correspond à l'approche de quantification utilisée dans QuantizeAndDequantize{V2|V3}
.
Si le mode est SCALED
, nous n'utilisons pas la plage complète du type de sortie, en choisissant d'élider la valeur la plus basse possible pour la symétrie (par exemple, la plage de sortie est de -127 à 127, et non de -128 à 127 pour la quantification 8 bits signée) de sorte que 0,0 correspond à 0.
Nous trouvons d'abord la plage de valeurs dans notre tenseur. La plage que nous utilisons est toujours centrée sur 0, donc nous trouvons m tel que
m = max(abs(input_min), abs(input_max))
Notre gamme de tenseur d'entrée est alors [-m, m]
.
Ensuite, nous choisissons nos [min_fixed, max_fixed]
quantification en virgule fixe, [min_fixed, max_fixed]
. Si T est signé, c'est
num_bits = sizeof(T) * 8 [min_fixed, max_fixed] = [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]
Sinon, si T n'est pas signé, la plage en virgule fixe est
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
À partir de là, nous calculons notre facteur d'échelle, s:
s = (max_fixed - min_fixed) / (2 * m)
Nous pouvons maintenant quantifier les éléments de notre tenseur:
result = round(input * s)
Une chose à surveiller est que l'opérateur peut choisir d'ajuster légèrement les valeurs minimum et maximum demandées pendant le processus de quantification, vous devez donc toujours utiliser les ports de sortie comme plage pour les calculs ultérieurs. Par exemple, si les valeurs minimum et maximum demandées sont proches de l'égalité, elles seront séparées par une petite valeur epsilon pour empêcher la création de tampons quantifiés mal formés. Sinon, vous pouvez vous retrouver avec des tampons où toutes les valeurs quantifiées correspondent à la même valeur flottante, ce qui pose des problèmes pour les opérations qui doivent effectuer des calculs supplémentaires sur eux.
Arguments:
- scope: un objet Scope
- min_range: La valeur scalaire minimale éventuellement produite pour l'entrée.
- max_range: La valeur scalaire maximale éventuellement produite pour l'entrée.
Retour:
-
Output
sortie: les données quantifiées produites à partir de l'entrée flottante. -
Output
output_min: valeur scalaire minimale réelle utilisée pour la sortie. -
Output
output_max: valeur scalaire maximale réelle utilisée pour la 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 | |
---|---|
Mode (StringPiece x) | |
RoundMode (StringPiece x) |
Structs | |
---|---|
tensorflow :: ops :: QuantizeV2 :: Attrs | Définisseurs d'attributs facultatifs pour QuantizeV2 . |
Attributs publics
opération
Operation operation
production
::tensorflow::Output output
output_max
::tensorflow::Output output_max
output_min
::tensorflow::Output output_min
Fonctions publiques
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 )
Fonctions statiques publiques
Mode
Attrs Mode( StringPiece x )
RoundMode
Attrs RoundMode( StringPiece x )