Quantize

Clase public final de cuantización

Cuantifique el tensor de 'entrada' de tipo float al tensor de 'salida' de tipo 'T'.

[rango_mín, rango_máx] son ​​flotantes escalares que especifican el rango para los datos de 'entrada'. El atributo 'modo' controla exactamente qué cálculos se utilizan para convertir los valores flotantes a sus equivalentes cuantificados. El atributo 'round_mode' controla qué algoritmo de redondeo de desempate se utiliza al redondear los valores flotantes a sus equivalentes cuantificados.

En el modo de 'MIN_COMBINED', cada valor del tensor se someterá a la siguiente:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
 if T == qint8: out[i] -= (range(T) + 1) / 2.0
 
aquí `gama (T) = numeric_limits :: max () - límites_numéricos :: min () `

Ejemplo de modo MIN_COMBINED

Suponga que la entrada es de tipo float y tiene un rango posible de [0.0, 6.0] y el tipo de salida es quint8 ([0, 255]). Los valores min_range y max_range deben especificarse como 0.0 y 6.0. La cuantificación de float a quint8 multiplicará cada valor de la entrada por 255/6 y se convertirá en quint8.

Si el tipo de salida era qint8 ([-128, 127]), la operación restará adicionalmente cada valor por 128 antes de la conversión, de modo que el rango de valores se alinee con el rango de qint8.

Si el modo es 'MIN_FIRST', entonces este enfoque se utiliza:

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 mayor diferencia entre esto y MIN_COMBINED es que el rango mínimo se redondea en primer lugar, antes de que se resta del valor redondeado. Con MIN_COMBINED, se introduce un pequeño sesgo en el que las iteraciones repetidas de cuantificación y descuantificación introducirán un error cada vez mayor.

Ejemplo de modo ESCALADO

El modo `SCALED` coincide con el enfoque de cuantificación utilizado en` QuantizeAndDequantize {V2 | V3} `.

Si el modo es "ESCALADO", la cuantificación se realiza multiplicando cada valor de entrada por un factor de escala. El factor de escalado se determina a partir `min_range` y` max_range` sea tan grande como sea posible de tal manera que el rango de `` min_range` a max_range` es representable dentro de valores de 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);
 
A continuación utilizamos el factor_escala para ajustar min_range y max_range como sigue:
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
por ejemplo, si T = qint8, e inicialmente min_range = -10, y max_range = 9, tendríamos comparar -128 / -10,0 = 12,8 a 127 / 9,0 = 14,11, y el conjunto de factor de escalado = 12,8 En este caso , min_range seguiría siendo -10, pero max_range se ajustaría a 127 / 12,8 = 9,921875

Por tanto, cuantificaremos los valores de entrada en el rango (-10, 9,921875) a (-128, 127).

El tensor de entrada ahora puede cuantificarse por el recorte de los valores a la gama `min_range` a` max_range`, a continuación, multiplicando por factor_escala como sigue:

result = round(min(max_range, max(min_range, input)) * scale_factor)
 
El ajustado `min_range` y` max_range` se devuelven como salidas 2 y 3 de esta operación . Estas salidas deben usarse como rango para cualquier cálculo adicional.

Atributo de rango estrecho (bool)

Si es cierto, no usamos el valor mínimo cuantificado. es decir, para int8 la salida cuantificada, estaría restringida al rango -127..127 en lugar del rango completo -128..127. Esto se proporciona por compatibilidad con ciertos backends de inferencia. (Solo se aplica al modo ESCALADO)

atributo de eje (int)

Un atributo opcional de "eje" puede especificar un índice de dimensión del tensor de entrada, de modo que los rangos de cuantificación se calcularán y aplicarán por separado para cada segmento del tensor a lo largo de esa dimensión. Esto es útil para la cuantificación por canal.

Si se especifica axis, min_range y max_range

si `axis` = None, la cuantificación por tensor se realiza normalmente.

Atributo asegurar_minimum_range (flotante)

Asegura que el rango de cuantificación mínimo sea al menos este valor. El valor predeterminado heredado para esto es 0.01, pero se recomienda encarecidamente establecerlo en 0 para nuevos usos.

Clases anidadas

clase Cuantizar.Opciones Los atributos opcionales de Quantize

Constantes

Cuerda OP_NAME El nombre de esta operación, como lo conoce el motor central de TensorFlow

Métodos públicos

estáticas Quantize.Options
eje (eje largo)
estática <T se extiende Ttype > Cuantización <T>
crear ( Alcance alcance, operando < TFloat32 > entrada, operando < TFloat32 > minRange, operando < TFloat32 > maxRange, Clase <T> T, Opciones ... Opciones)
Método de fábrica para crear una clase que envuelva una nueva operación de cuantización.
estáticas Quantize.Options
ensureMinimumRange (Float ensureMinimumRange)
estáticas Quantize.Options
el modo (modo String)
estáticas Quantize.Options
narrowRange (Boolean narrowRange)
Salida <T>
salida ()
Los datos cuantificados producidos a partir de la entrada flotante.
Salida < TFloat32 >
outputMax ()
El rango de cuantificación final máximo, utilizado para recortar los valores de entrada antes de escalarlos y redondearlos a valores cuantificados.
Salida < TFloat32 >
outputMin ()
El mínimo del rango de cuantificación final, que se utiliza para recortar los valores de entrada antes de escalarlos y redondearlos a valores cuantificados.
estáticas Quantize.Options
roundMode (String roundMode)

Métodos heredados

Constantes

OP_NAME pública final static String

El nombre de esta operación, como lo conoce el motor central de TensorFlow

Valor constante: "QuantizeV2"

Métodos públicos

public static Quantize.Options eje (eje largo)

public static cuantización <T> crear ( Alcance alcance, operando < TFloat32 > entrada, operando < TFloat32 > minRange, operando < TFloat32 > maxRange, Clase <T> T, Opciones ... Opciones)

Método de fábrica para crear una clase que envuelva una nueva operación de cuantización.

Parámetros
alcance alcance actual
minRange El valor mínimo del rango de cuantificación. Este valor puede ser ajustado por el operador dependiendo de otros parámetros. El valor ajustado se escribe en `output_min`. Si se especifica el atributo `eje`, este debe ser un tensor 1-D cuyo tamaño coincida con la dimensión del` eje` de los tensores de entrada y salida.
rango máximo El valor máximo del rango de cuantificación. Este valor puede ser ajustado por el operador dependiendo de otros parámetros. El valor ajustado se escribe en `output_max`. Si se especifica el atributo `eje`, este debe ser un tensor 1-D cuyo tamaño coincida con la dimensión del` eje` de los tensores de entrada y salida.
opciones lleva valores de atributos opcionales
Devoluciones
  • una nueva instancia de Quantize

public static Quantize.Options ensureMinimumRange (Float ensureMinimumRange)

estáticas pública Quantize.Options modo (modo de cadena)

public static Quantize.Options narrowRange (booleano narrowRange)

pública de salida <T> salida ()

Los datos cuantificados producidos a partir de la entrada flotante.

pública de salida < TFloat32 > outputMax ()

El rango de cuantificación final máximo, utilizado para recortar los valores de entrada antes de escalarlos y redondearlos a valores cuantificados. Si se especifica el atributo `eje`, este será un tensor 1-D cuyo tamaño coincide con la dimensión del` eje` de los tensores de entrada y salida.

pública de salida < TFloat32 > outputMin ()

El mínimo del rango de cuantificación final, que se utiliza para recortar los valores de entrada antes de escalarlos y redondearlos a valores cuantificados. Si se especifica el atributo `eje`, este será un tensor 1-D cuyo tamaño coincide con la dimensión del` eje` de los tensores de entrada y salida.

public static Quantize.Options roundMode (String roundMode)