Quantize

aula final pública Quantize

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
 
aqui `intervalo (T) = limites_numéricos ::max() - limites_numéricos ::min()`

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())
 
A maior diferença entre este e MIN_COMBINED é que o intervalo mínimo é arredondado primeiro, antes de ser subtraído do valor arredondado. Com MIN_COMBINED, um pequeno viés é introduzido onde repetidas iterações de quantização e desquantização introduzirão um erro cada vez maior.

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);
 
Em seguida, usamos o scale_factor para ajustar min_range e max_range da seguinte forma:
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
por exemplo, se T = qint8 e inicialmente intervalo_min = -10 e intervalo_max = 9, compararíamos -128/-10,0 = 12,8 a 127/9,0 = 14,11 e definiríamos scaling_factor = 12,8. Nesse caso, intervalo_min permaneceria -10, mas max_range seria ajustado para 127/12,8 = 9,921875

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)
 
Os `min_range` e `max_range` ajustados são retornados como saídas 2 e 3 desta operação. Essas saídas devem ser usadas como intervalo para quaisquer cálculos adicionais.

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>
create ( Escopo do 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.
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

Valor Constante: "QuantizeV2"

Métodos Públicos

Eixo público estático Quantize.Options (eixo longo)

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

public static Quantize.Options garantirMinimumRange (Float garantirMinimumRange)

modo Quantize.Options estático público (modo String)

public static Quantize.Options strictRange (Boolean strictRange)

Saída pública <T> saída ()

Os dados quantizados produzidos a partir da entrada flutuante.

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.

public static Quantize.Options roundMode (String roundMode)