tensorflow:: ops:: QuantizeV2
#include <array_ops.h>Cuantiza el tensor de 'entrada' de tipo float a un tensor de 'salida' de tipo 'T'.
Resumen
[min_range, max_range] son valores flotantes escalares que especifican el rango de los datos de entrada. El atributo 'mode' controla los cálculos que se utilizan para convertir los valores flotantes a sus equivalentes cuantizados. El atributo 'round_mode' controla el algoritmo de desempate de redondeo que se utiliza al redondear los valores flotantes a sus equivalentes cuantizados.
En el modo 'MIN_COMBINED', cada valor del tensor se someterá a lo siguiente:
out[i] = (in[i] - min_range) * range(T) / (max_range - min_range) if T == qint8: out[i] -= (range(T) + 1) / 2.0
aquí range(T) = numeric_limits
Ejemplo de modo MIN_COMBINED
Supongamos que la entrada es de tipo float y tiene un rango posible de [0.0, 6.0], y que la salida es de tipo quint8 ([0, 255]). Los valores min_range y max_range deben especificarse como 0.0 y 6.0. La cuantización de float a quint8 multiplicará cada valor de la entrada por 255/6 y lo convertirá a quint8.
Si el tipo de salida era qint8 ([-128, 127]), la operación restará adicionalmente 128 a cada valor 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 se utiliza este enfoque:
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 principal diferencia entre esta función y MIN_COMBINED radica en que el rango mínimo se redondea primero, antes de restarlo del valor redondeado. Con MIN_COMBINED, se introduce un pequeño sesgo, ya que las iteraciones repetidas de cuantificación y descuantización generan un error cada vez mayor.
Ejemplo de modo ESCALAR
El modo SCALED coincide con el enfoque de cuantización utilizado en QuantizeAndDequantize{V2|V3} .
Si el modo es SCALED , no utilizamos todo el rango del tipo de salida, optando por omitir el valor más bajo posible por simetría (por ejemplo, el rango de salida es de -127 a 127, no de -128 a 127 para la cuantización de 8 bits con signo), de modo que 0,0 se asigna a 0.
Primero encontramos el rango de valores en nuestro tensor. El rango que usamos siempre está centrado en 0, por lo que encontramos m tal que
m = max(abs(input_min), abs(input_max))
Nuestro rango de tensor de entrada es entonces [-m, m] .
A continuación, elegimos nuestros cubos de cuantización de punto fijo, [min_fixed, max_fixed] . Si T es con signo, esto es
num_bits = sizeof(T) * 8
[min_fixed, max_fixed] =
[-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]De lo contrario, si T no tiene signo, el rango de punto fijo es
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
A partir de esto calculamos nuestro factor de escala, s:
s = (max_fixed - min_fixed) / (2 * m)
Ahora podemos cuantizar los elementos de nuestro tensor:
result = round(input * s)
Un aspecto a tener en cuenta es que el operador puede ajustar ligeramente los valores mínimo y máximo solicitados durante el proceso de cuantización, por lo que siempre se deben usar los puertos de salida como rango para los cálculos posteriores. Por ejemplo, si los valores mínimo y máximo solicitados son casi iguales, se separarán mediante un pequeño valor épsilon para evitar la creación de búferes cuantizados con formato incorrecto. De lo contrario, se pueden obtener búferes donde todos los valores cuantizados se asignan al mismo valor flotante, lo que causa problemas en las operaciones que requieren realizar cálculos posteriores sobre ellos.
Argumentos:
- ámbito: Un objeto de ámbito
- min_range: El valor escalar mínimo que se puede producir para la entrada.
- max_range: El valor escalar máximo que se puede producir para la entrada.
Devoluciones:
-
Output: Los datos cuantificados producidos a partir de la entrada de punto flotante. -
Outputoutput_min: El valor escalar mínimo real utilizado para la salida. -
Outputoutput_max: El valor escalar máximo real utilizado para la salida.
Constructores y destructores | |
|---|---|
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) |
Atributos públicos | |
|---|---|
operation | |
output | |
output_max | |
output_min | |
funciones estáticas públicas | |
|---|---|
Mode (StringPiece x) | |
RoundMode (StringPiece x) | |
Estructuras | |
|---|---|
| tensorflow:: ops:: QuantizeV2:: Attrs | Configuradores de atributos opcionales para QuantizeV2 . |
Atributos públicos
operación
Operation operation
producción
::tensorflow::Output output
salida_máx
::tensorflow::Output output_max
salida_min
::tensorflow::Output output_min
Funciones públicas
CuantizarV2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T )
CuantizarV2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs )
funciones estáticas públicas
Modo
Attrs Mode( StringPiece x )
Modo redondo
Attrs RoundMode( StringPiece x )