Quantize

공개 최종 수업 Quantize

float 유형의 '입력' 텐서를 'T' 유형의 '출력' 텐서로 양자화합니다.

[min_range, max_range]는 '입력' 데이터의 범위를 지정하는 스칼라 부동 소수점입니다. 'mode' 속성은 float 값을 양자화된 값으로 변환하는 데 사용되는 계산을 정확하게 제어합니다. 'round_mode' 속성은 부동 소수점 값을 양자화된 값으로 반올림할 때 사용되는 반올림 타이 브레이킹 알고리즘을 제어합니다.

'MIN_COMBINED' 모드에서 텐서의 각 값은 다음을 수행합니다.

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
 if T == qint8: out[i] -= (range(T) + 1) / 2.0
 
여기 `범위(T) = 숫자_한계 ::max() - 숫자 제한 ::최소()`

MIN_COMBINED 모드 예

입력이 float 유형이고 가능한 범위가 [0.0, 6.0]이고 출력 유형이 quint8 ([0, 255])이라고 가정합니다. min_range 및 max_range 값은 0.0 및 6.0으로 지정되어야 합니다. float에서 quint8로 양자화하면 입력의 각 값에 255/6을 곱하고 quint8로 변환됩니다.

출력 유형이 qint8([-128, 127])인 경우 작업은 캐스팅 전에 각 값을 128씩 추가로 빼므로 값 범위가 qint8의 범위와 일치합니다.

모드가 'MIN_FIRST'인 경우 다음 접근 방식이 사용됩니다.

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())
 
MIN_COMBINED와 가장 큰 차이점은 최소 범위가 반올림된 값에서 빼기 전에 먼저 반올림된다는 것입니다. MIN_COMBINED를 사용하면 반복적인 양자화 및 역양자화 반복으로 인해 점점 더 큰 오류가 발생하는 작은 편향이 도입됩니다.

스케일 모드 예

`SCALED` 모드는 `QuantizeAndDeQuantize{V2|V3}`에 사용된 양자화 접근 방식과 일치합니다.

모드가 'SCALED'인 경우 각 입력 값에 scale_factor를 곱하여 양자화를 수행합니다. scale_factor는 'min_range'에서 'max_range'까지의 범위가 T 유형의 값 내에서 표현 가능하도록 'min_range' 및 'max_range'에서 최대한 크게 결정됩니다.

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);
 
다음으로 scale_factor를 사용하여 다음과 같이 min_range 및 max_range를 조정합니다.
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
예를 들어 T = qint8이고 초기에 min_range = -10, max_range = 9인 경우 -128/-10.0 = 12.8을 127/9.0 = 14.11과 비교하고 scale_factor = 12.8로 설정합니다. 이 경우 min_range는 -10으로 유지됩니다. 그러나 max_range는 127 / 12.8 = 9.921875로 조정됩니다.

따라서 (-10, 9.921875) ~ (-128, 127) 범위의 입력 값을 양자화하겠습니다.

이제 'min_range'에서 'max_range' 범위로 값을 잘라낸 후 다음과 같이 scale_factor를 곱하여 입력 텐서를 양자화할 수 있습니다.

result = round(min(max_range, max(min_range, input)) * scale_factor)
 
조정된 '최소 범위' 및 '최대 범위'는 이 작업의 출력 2와 3으로 반환됩니다. 이러한 출력은 추가 계산을 위한 범위로 사용되어야 합니다.

Narrow_range(부울) 속성

true인 경우 최소 양자화된 값을 사용하지 않습니다. 즉, int8 양자화된 출력의 경우 전체 -128..127 범위 대신 -127..127 범위로 제한됩니다. 이는 특정 추론 백엔드와의 호환성을 위해 제공됩니다. (SCALED 모드에만 적용됩니다)

축(int) 속성

선택적 '축' 속성은 입력 텐서의 차원 인덱스를 지정할 수 있으므로 양자화 범위는 해당 차원을 따라 텐서의 각 조각에 대해 별도로 계산되고 적용됩니다. 이는 채널별 양자화에 유용합니다.

축이 지정되면 min_range 및 max_range

`axis`=None인 경우, 텐서당 양자화가 정상적으로 수행됩니다.

verify_minimum_range(부동 소수점) 속성

최소 양자화 범위가 이 값 이상인지 확인합니다. 이에 대한 레거시 기본값은 0.01이지만 새로운 용도로 사용하려면 0으로 설정하는 것이 좋습니다.

중첩 클래스

수업 퀀타이즈.옵션 Quantize 의 선택적 속성

상수

OP_NAME TensorFlow 핵심 엔진에서 알려진 이 작업의 이름

공개 방법

정적 Quantize.Options
(장축)
static <T는 TType을 확장합니다. > Quantize <T>
생성 ( 범위 범위 , 피연산자 < TFloat32 > 입력, 피연산자 < TFloat32 > minRange, 피연산자 < TFloat32 > maxRange, Class<T> T, 옵션... 옵션)
새로운 Quantize 작업을 래핑하는 클래스를 생성하는 팩토리 메서드입니다.
정적 Quantize.Options
verifyMinimumRange (Float verifyMinimumRange)
정적 Quantize.Options
모드 (문자열 모드)
정적 Quantize.Options
NarrowRange (부울 NarrowRange)
출력 <T>
출력 ()
float 입력에서 생성된 양자화된 데이터입니다.
출력 < TFloat32 >
출력최대 ()
입력 값을 크기 조정하고 양자화된 값으로 반올림하기 전에 입력 값을 잘라내는 데 사용되는 최종 양자화 범위 최대값입니다.
출력 < TFloat32 >
출력최소 ()
입력 값을 크기 조정하고 양자화된 값으로 반올림하기 전에 입력 값을 잘라내는 데 사용되는 최종 양자화 범위 최소값입니다.
정적 Quantize.Options
roundMode (문자열 roundMode)

상속된 메서드

상수

공개 정적 최종 문자열 OP_NAME

TensorFlow 핵심 엔진에서 알려진 이 작업의 이름

상수 값: "QuantizeV2"

공개 방법

public static Quantize.Options (장축)

공개 정적 Quantize <T> 생성 ( 범위 범위, Operand < TFloat32 > 입력, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, 옵션... 옵션)

새로운 Quantize 작업을 래핑하는 클래스를 생성하는 팩토리 메서드입니다.

매개변수
범위 현재 범위
최소 범위 양자화 범위의 최소값입니다. 이 값은 다른 매개변수에 따라 op에 의해 조정될 수 있습니다. 조정된 값은 `output_min`에 기록됩니다. `axis` 속성이 지정된 경우 이는 입력 및 출력 텐서의 `axis` 차원과 크기가 일치하는 1차원 텐서여야 합니다.
최대 범위 양자화 범위의 최대값입니다. 이 값은 다른 매개변수에 따라 op에 의해 조정될 수 있습니다. 조정된 값은 `output_max`에 기록됩니다. `axis` 속성이 지정된 경우 이는 입력 및 출력 텐서의 `axis` 차원과 크기가 일치하는 1차원 텐서여야 합니다.
옵션 선택적 속성 값을 전달합니다.
보고
  • Quantize의 새로운 인스턴스

공개 정적 Quantize.Options verifyMinimumRange (Float verifyMinimumRange)

public static Quantize.Options 모드 (문자열 모드)

공개 정적 Quantize.OptionsarrowRange ( BooleanarrowRange)

공개 출력 <T> 출력 ()

float 입력에서 생성된 양자화된 데이터입니다.

공개 출력 < TFloat32 > outputMax ()

입력 값을 크기 조정하고 양자화된 값으로 반올림하기 전에 입력 값을 잘라내는 데 사용되는 최종 양자화 범위 최대값입니다. `axis` 속성이 지정되면 이는 입력 및 출력 텐서의 `axis` 차원과 크기가 일치하는 1차원 텐서가 됩니다.

공개 출력 < TFloat32 > 출력Min ()

입력 값을 크기 조정하고 양자화된 값으로 반올림하기 전에 입력 값을 잘라내는 데 사용되는 최종 양자화 범위 최소값입니다. `axis` 속성이 지정되면 이는 입력 및 출력 텐서의 `axis` 차원과 크기가 일치하는 1차원 텐서가 됩니다.

공개 정적 Quantize.Options roundMode (문자열 roundMode)