Quantize

classe finale pubblica Quantize

Quantizza il tensore 'input' di tipo float nel tensore 'output' di tipo 'T'.

[min_range, max_range] sono float scalari che specificano l'intervallo per i dati di "input". L'attributo 'mode' controlla esattamente quali calcoli vengono utilizzati per convertire i valori float nei loro equivalenti quantizzati. L'attributo 'round_mode' controlla quale algoritmo di arrotondamento viene utilizzato quando si arrotondano i valori float ai loro equivalenti quantizzati.

Nella modalità 'MIN_COMBINED', ciascun valore del tensore subirà quanto segue:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
 if T == qint8: out[i] -= (range(T) + 1) / 2.0
 
qui `range(T) = numeric_limits ::max() - limiti_numerici ::min()`

Esempio di modalità MIN_COMBINED

Supponiamo che l'input sia di tipo float e abbia un intervallo possibile di [0.0, 6.0] e che il tipo di output sia quint8 ([0, 255]). I valori min_range e max_range devono essere specificati come 0,0 e 6,0. La quantizzazione da float a quint8 moltiplicherà ciascun valore dell'input per 255/6 e lo trasformerà in quint8.

Se il tipo di output era qint8 ([-128, 127]), l'operazione sottrarrà inoltre ogni valore di 128 prima della conversione, in modo che l'intervallo di valori si allinei con l'intervallo di qint8.

Se la modalità è "MIN_FIRST", viene utilizzato questo approccio:

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 differenza più grande tra questo e MIN_COMBINED è che l'intervallo minimo viene arrotondato per primo, prima di essere sottratto dal valore arrotondato. Con MIN_COMBINED, viene introdotto un piccolo bias in cui ripetute iterazioni di quantizzazione e dequantizzazione introdurranno un errore sempre più grande.

Esempio della modalità SCALA

La modalità "SCALED" corrisponde all'approccio di quantizzazione utilizzato in "QuantizeAndDequantize{V2|V3}".

Se la modalità è "SCALED", la quantizzazione viene eseguita moltiplicando ciascun valore di input per un fattore_di_scaling. Il fattore di scala è determinato da "intervallo_min" e "intervallo_max" in modo che sia il più ampio possibile in modo tale che l'intervallo da "intervallo_min" a "intervallo_max" sia rappresentabile all'interno di valori di tipo 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);
 
Successivamente utilizziamo scale_factor per regolare min_range e max_range come segue:
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
ad esempio, se T = qint8 e inizialmente min_range = -10 e max_range = 9, confronteremo -128/-10.0 = 12.8 con 127/9.0 = 14.11 e imposteremo scaling_factor = 12.8 In questo caso, min_range rimarrebbe -10, ma max_range verrebbe regolato su 127/12,8 = 9,921875

Quindi quantizzeremo i valori di input nell'intervallo da (-10, 9,921875) a (-128, 127).

Il tensore di input può ora essere quantizzato ritagliando i valori nell'intervallo da "min_range" a "max_range", quindi moltiplicando per scale_factor come segue:

result = round(min(max_range, max(min_range, input)) * scale_factor)
 
I valori "min_range" e "max_range" modificati vengono restituiti come output 2 e 3 di questa operazione. Queste uscite dovrebbero essere utilizzate come intervallo per eventuali ulteriori calcoli.

Attributo narrow_range (bool).

Se vero, non utilizziamo il valore quantizzato minimo. cioè per int8 l'output quantizzato, sarebbe limitato all'intervallo -127..127 anziché all'intero intervallo -128..127. Questo è fornito per la compatibilità con alcuni backend di inferenza. (Si applica solo alla modalità SCALED)

attributo asse (int).

Un attributo opzionale `axis` può specificare un indice di dimensione del tensore di input, in modo tale che gli intervalli di quantizzazione verranno calcolati e applicati separatamente per ciascuna fetta del tensore lungo quella dimensione. Ciò è utile per la quantizzazione per canale.

Se è specificato l'asse, intervallo_min e intervallo_max

se `axis`=None, la quantizzazione per tensore viene eseguita normalmente.

Attributo Guarantee_minimum_range (float).

Garantisce che l'intervallo di quantizzazione minimo sia almeno questo valore. Il valore predefinito legacy per questo è 0,01, ma si consiglia vivamente di impostarlo su 0 per nuovi usi.

Classi nidificate

classe Quantizza.Opzioni Attributi facoltativi per Quantize

Costanti

Corda OP_NAME Il nome di questa operazione, come noto al motore principale di TensorFlow

Metodi pubblici

Quantize.Options statiche
asse (asse lungo)
statico <T estende TType > Quantizza <T>
create ( ambito ambito , Operando < TFloat32 > input, Operando < TFloat32 > minRange, Operando < TFloat32 > maxRange, Classe<T> T, Opzioni... opzioni)
Metodo factory per creare una classe che racchiude una nuova operazione Quantize.
Quantize.Options statiche
garantireMinimumRange (Float garantireMinimumRange)
Quantize.Options statiche
modalità (modalità stringa)
Quantize.Options statiche
narrowRange (Booleano narrowRange)
Uscita <T>
produzione ()
I dati quantizzati prodotti dall'input float.
Uscita < TFloat32 >
uscitaMax ()
Il massimo dell'intervallo di quantizzazione finale, utilizzato per ritagliare i valori di input prima di ridimensionarli e arrotondarli a valori quantizzati.
Uscita < TFloat32 >
uscitaMin ()
Il minimo dell'intervallo di quantizzazione finale, utilizzato per ritagliare i valori di input prima di ridimensionarli e arrotondarli a valori quantizzati.
Quantize.Options statiche
roundMode (Stringa roundMode)

Metodi ereditati

Costanti

Stringa finale statica pubblica OP_NAME

Il nome di questa operazione, come noto al motore principale di TensorFlow

Valore costante: "QuantizeV2"

Metodi pubblici

asse Quantize.Options statico pubblico (asse lungo)

public static Quantize <T> create ( Scope scope, Operando < TFloat32 > input, Operando < TFloat32 > minRange, Operando < TFloat32 > maxRange, Class<T> T, Opzioni... opzioni)

Metodo factory per creare una classe che racchiude una nuova operazione Quantize.

Parametri
portata ambito attuale
minRange Il valore minimo dell'intervallo di quantizzazione. Questo valore può essere regolato dall'operatore in base ad altri parametri. Il valore modificato viene scritto in "output_min". Se l'attributo `axis` è specificato, questo deve essere un tensore 1-D la cui dimensione corrisponde alla dimensione `axis` dei tensori di input e output.
maxRange Il valore massimo dell'intervallo di quantizzazione. Questo valore può essere regolato dall'operatore in base ad altri parametri. Il valore modificato viene scritto in "output_max". Se l'attributo `axis` è specificato, questo deve essere un tensore 1-D la cui dimensione corrisponde alla dimensione `axis` dei tensori di input e output.
opzioni trasporta valori di attributi opzionali
Ritorni
  • una nuova istanza di Quantize

public static Quantize.Options GuaranteeMinimumRange (Float GuaranteeMinimumRange)

modalità Quantize.Options statica pubblica (modalità String)

public static Quantize.Options narrowRange (Boolean narrowRange)

Uscita pubblica <T> uscita ()

I dati quantizzati prodotti dall'input float.

Uscita pubblica < TFloat32 > outputMax ()

Il massimo dell'intervallo di quantizzazione finale, utilizzato per ritagliare i valori di input prima di ridimensionarli e arrotondarli a valori quantizzati. Se viene specificato l'attributo `axis`, questo sarà un tensore 1-D la cui dimensione corrisponde alla dimensione `axis` dei tensori di input e output.

Uscita pubblica < TFloat32 > outputMin ()

Il minimo dell'intervallo di quantizzazione finale, utilizzato per ritagliare i valori di input prima di ridimensionarli e arrotondarli a valori quantizzati. Se viene specificato l'attributo `axis`, questo sarà un tensore 1-D la cui dimensione corrisponde alla dimensione `axis` dei tensori di input e output.

public static Quantize.Options roundMode (String roundMode)