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

org.tensorflow.op.RawOp
booleano final
é igual (objeto obj)
int final
Operação
op ()
Retorne esta unidade de cálculo como uma única Operation .
sequência final
booleano
é igual (objeto arg0)
aula final<?>
getClass ()
interno
código hash ()
vazio final
notificar ()
vazio final
notificar todos ()
Corda
toString ()
vazio final
espere (long arg0, int arg1)
vazio final
espere (arg0 longo)
vazio final
espere ()
org.tensorflow.op.Op
ambiente de execução abstrato
env ()
Retorne o ambiente de execução em que esta operação foi criada.
operação abstrata
op ()
Retorne esta unidade de cálculo como uma única Operation .

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)