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_limitsExemplo 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,921875Portanto, 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> | |
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
Métodos Públicos
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
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.