Quantize

public final class Quantize

Quantize o tensor de 'entrada' do tipo float para o tensor de 'saída' do tipo 'T'.

[intervalo_min, intervalo_max] são flutuantes escalares que especificam o intervalo para os dados de 'entrada'. O atributo 'modo' 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 vai ser submetido aos seguintes:

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) = numeric_limits :: max () - numeric_limits :: min () `

Exemplo de modo MIN_COMBINED

Suponha que a entrada seja do tipo flutuante e tenha uma faixa 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. Quantizar de float para quint8 irá multiplicar cada valor da entrada por 255/6 e converter para quint8.

Se o tipo de saída for qint8 ([-128, 127]), a operação subtrairá adicionalmente cada valor por 128 antes da conversão, de modo que o intervalo de valores se alinhe com o intervalo de qint8.

Se o modo for 'MIN_FIRST', então esta abordagem é 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 alcance mínimo é arredondado em primeiro lugar, antes de ser subtraído o valor arredondado. Com MIN_COMBINED, um pequeno viés é introduzido, onde iterações repetidas de quantização e desquantização irão introduzir um erro cada vez maior.

Exemplo de modo ESCALA

O modo `ESCALADA` corresponde à abordagem de quantização usada em` QuantizeAndDequantize {V2 | V3} `.

Se o modo for `ESCALADA`, a quantização é realizada multiplicando cada valor de entrada por um fator_escala. O scaling_factor é determinada a partir `` min_range` e max_range` a ser tão grande quanto possível de modo a que a gama de min_range` `a` max_range` é representável 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 seguir, utilizar o fator_escala para ajustar e min_range max_range como se segue:
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
por exemplo, no caso de T = qint8, e inicialmente min_range = -10, e max_range = 9, que iria comparar -128 / = -10,0 12,8-127 / 9,0 = 14,11, e conjunto scaling_factor = 12,8 neste caso , intervalo_min permaneceria -10, mas intervalo_max 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 podem agora ser quantificados por grampeamento valores para a gama `` min_range` para max_range`, multiplicando em seguida por fator_escala como se segue:

result = round(min(max_range, max(min_range, input)) * scale_factor)
 
a `` min_range` ajustado e max_range` 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 gama_estrita (bool)

Se verdadeiro, não usamos o valor mínimo quantizado. ou seja, para int8 a saída quantizada, seria restrito ao intervalo -127..127 em vez do intervalo total -128..127. Isso é fornecido para compatibilidade com determinados back-ends de inferência. (Aplica-se apenas ao modo ESCALA)

atributo do 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 `eixo` = Nenhum, a quantização por tensor é realizada normalmente.

atributo garantir_minimum_range (float)

Garante que o intervalo mínimo de quantização seja pelo menos este valor. O valor padrão legado para isso é 0,01, mas é altamente recomendável defini-lo como 0 para novos usos.

Classes aninhadas

classe Quantize.Options Atributos opcionais para Quantize

Constantes

Fragmento OP_NAME O nome desta operação, conforme conhecido pelo motor principal TensorFlow

Métodos Públicos

estáticos Quantize.Options
eixo (eixo Long)
estática <T estende TType > Quantize <T>
criar ( Scope escopo, Operando < TFloat32 > entrada, Operando < TFloat32 > minRange, Operando < TFloat32 > MaxRange, Class <T> T, Options ... Opções)
Método de fábrica para criar uma classe envolvendo uma nova operação Quantize.
estáticos Quantize.Options
ensureMinimumRange (Flutuador ensureMinimumRange)
estáticos Quantize.Options
Modo (modo da corda)
estáticos Quantize.Options
narrowRange (booleano narrowRange)
Output <T>
saída ()
Os dados quantizados produzidos a partir da entrada float.
Output < TFloat32 >
outputMax ()
O máximo do intervalo de quantização final, usado para cortar valores de entrada antes de escaloná-los e arredondá-los para valores quantizados.
Output < TFloat32 >
outputMin ()
O mínimo do intervalo de quantização final, usado para cortar valores de entrada antes de escaloná-los e arredondá-los para valores quantizados.
estáticos Quantize.Options
roundMode (String roundMode)

Métodos herdados

Constantes

nome_op final String public static

O nome desta operação, conforme conhecido pelo motor principal TensorFlow

Valor constante: "QuantizeV2"

Métodos Públicos

public static Quantize.Options eixos (eixo Long)

public static Quantize <T> create ( Scope escopo, Operando < TFloat32 > entrada, Operando < TFloat32 > minRange, Operando < TFloat32 > MaxRange, Class <T> T, Options ... Opções)

Método de fábrica para criar uma classe envolvendo uma nova operação Quantize.

Parâmetros
alcance escopo atual
minRange O valor mínimo da faixa de quantização. Este valor pode ser ajustado pelo op dependendo de outros parâmetros. O valor ajustado é escrito em `output_min`. Se o atributo `axis` for especificado, deve ser um tensor 1-D cujo tamanho corresponda à dimensão` axis` dos tensores de entrada e saída.
maxRange O valor máximo do intervalo de quantização. Este valor pode ser ajustado pelo op dependendo de outros parâmetros. O valor ajustado é escrito em `output_max`. Se o atributo `axis` for especificado, deve ser um tensor 1-D cujo tamanho corresponda à 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 ensureMinimumRange (Float ensureMinimumRange)

public static Quantize.Options mode (modo String)

public static Quantize.Options narrowRange (Boolean narrowRange)

pública Output <T> de saída ()

Os dados quantizados produzidos a partir da entrada float.

pública Output < TFloat32 > outputMax ()

O máximo do intervalo de quantização final, usado para cortar valores de entrada antes de escaloná-los e arredondá-los para valores quantizados. Se o atributo `axis` for especificado, será um tensor 1-D cujo tamanho corresponde à dimensão` axis` dos tensores de entrada e saída.

pública Output < TFloat32 > outputMin ()

O mínimo do intervalo de quantização final, usado para cortar valores de entrada antes de escaloná-los e arredondá-los para valores quantizados. Se o atributo `axis` for especificado, 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)