Quantize o tensor de 'entrada' do tipo float para o tensor de 'saída' do tipo 'T'.
[min_range, max_range] são flutuadores escalares que especificam o intervalo para os dados de 'entrada'. O atributo 'mode' controla exatamente quais cálculos são usados para converter os valores flutuantes em seus equivalentes quantizados. O atributo 'round_mode' controla qual algoritmo de desempate de arredondamento é usado ao arredondar valores flutuantes para seus equivalentes quantizados.
No modo 'MIN_COMBINED', cada valor do tensor passará pelo seguinte:
out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0
Exemplo de modo MIN_COMBINED
Suponha que a entrada seja do tipo float e tenha um intervalo possível de [0,0, 6,0] e o tipo de saída seja quint8 ([0, 255]). Os valores min_range e max_range devem ser especificados como 0,0 e 6,0. A quantização de float para quint8 multiplicará cada valor da entrada por 255/6 e será convertida em quint8.
Se o tipo de saída for qint8 ([-128, 127]), a operação subtrairá adicionalmente cada valor por 128 antes da conversão, para que o intervalo de valores se alinhe com o intervalo de qint8.
Se o modo for 'MIN_FIRST', então esta abordagem será usada:
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())
Exemplo de modo ESCALADO
O modo `SCALED` corresponde à abordagem de quantização usada em `QuantizeAndDequantize{V2|V3}`.
Se o modo for `SCALED`, a quantização é realizada multiplicando cada valor de entrada por um fator de escala. O fator de escala é determinado a partir de `min_range` e `max_range` para ser o maior possível, de modo que o intervalo de `min_range` a `max_range` seja representável dentro de valores do 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);
min_range = min_T / scale_factor;
max_range = max_T / scale_factor;
Portanto, quantizaremos os valores de entrada no intervalo (-10, 9,921875) a (-128, 127).
O tensor de entrada agora pode ser quantizado cortando valores no intervalo `min_range` a `max_range` e multiplicando por scale_factor da seguinte forma:
result = round(min(max_range, max(min_range, input)) * scale_factor)
atributo intervalo_estreito (bool)
Se for verdade, não usamos o valor quantizado mínimo. ou seja, para int8 a saída quantizada, ela seria restrita ao intervalo -127..127 em vez do intervalo completo -128..127. Isso é fornecido para compatibilidade com determinados back-ends de inferência. (Aplica-se apenas ao modo SCALED)
atributo eixo (int)
Um atributo opcional `axis` pode especificar um índice de dimensão do tensor de entrada, de modo que os intervalos de quantização sejam calculados e aplicados separadamente para cada fatia do tensor ao longo dessa dimensão. Isso é útil para quantização por canal.
Se o eixo for especificado, min_range e max_range
se `axis`=None, a quantização por tensor é realizada normalmente.
Atributo garantir_intervalo_mínimo (float)
Garante que a faixa mínima de quantização seja pelo menos esse valor. O valor padrão herdado para isso é 0,01, mas é altamente recomendável defini-lo como 0 para novos usos.
Classes aninhadas
aula | Quantizar.Opções | Atributos opcionais para Quantize |
Constantes
Corda | OP_NAME | O nome desta operação, conforme conhecido pelo mecanismo principal do TensorFlow |
Métodos Públicos
Quantize.Options estático | eixo (eixo longo) |
estático <T estende TType > Quantize <T> | |
Quantize.Options estático | garantirMinimumRange (flutuante garantirMinimumRange) |
Quantize.Options estático | modo (modo String) |
Quantize.Options estático | NarrowRange (Boolean NarrowRange) |
Saída <T> | saída () Os dados quantizados produzidos a partir da entrada flutuante. |
Saída < TFloat32 > | saídaMax () O intervalo máximo de quantização final, usado para cortar valores de entrada antes de redimensioná-los e arredondá-los para valores quantizados. |
Saída < TFloat32 > | saídaMin () O intervalo mínimo de quantização final, usado para cortar valores de entrada antes de redimensioná-los e arredondá-los para valores quantizados. |
Quantize.Options estático | roundMode (String roundMode) |
Métodos herdados
Constantes
String final estática pública OP_NAME
O nome desta operação, conforme conhecido pelo mecanismo principal do TensorFlow
Métodos Públicos
public static Quantize <T> create ( Escopo de escopo, Operando < TFloat32 > entrada, Operando < TFloat32 > minRange, Operando < TFloat32 > maxRange, Classe<T> T, Opções... opções)
Método de fábrica para criar uma classe que envolve uma nova operação Quantize.
Parâmetros
escopo | escopo atual |
---|---|
intervalo mínimo | O valor mínimo do intervalo de quantização. Este valor pode ser ajustado pelo operador dependendo de outros parâmetros. O valor ajustado é gravado em `output_min`. Se o atributo `axis` for especificado, este deve ser um tensor 1-D cujo tamanho corresponde à dimensão `axis` dos tensores de entrada e saída. |
intervalo máximo | O valor máximo do intervalo de quantização. Este valor pode ser ajustado pelo operador dependendo de outros parâmetros. O valor ajustado é gravado em `output_max`. Se o atributo `axis` for especificado, este deve ser um tensor 1-D cujo tamanho corresponde à dimensão `axis` dos tensores de entrada e saída. |
opções | carrega valores de atributos opcionais |
Devoluções
- uma nova instância de Quantize
Saída pública < TFloat32 > outputMax ()
O intervalo máximo de quantização final, usado para cortar valores de entrada antes de redimensioná-los e arredondá-los para valores quantizados. Se o atributo `axis` for especificado, este será um tensor 1-D cujo tamanho corresponde à dimensão `axis` dos tensores de entrada e saída.
Saída pública < TFloat32 > outputMin ()
O intervalo mínimo de quantização final, usado para cortar valores de entrada antes de redimensioná-los e arredondá-los para valores quantizados. Se o atributo `axis` for especificado, este será um tensor 1-D cujo tamanho corresponde à dimensão `axis` dos tensores de entrada e saída.