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)

상속된 메서드

org.tensorflow.op.RawOp 클래스에서
최종 부울
같음 (객체 객체)
최종 정수
작업
op ()
이 계산 단위를 단일 Operation 으로 반환합니다.
최종 문자열
부울
같음 (개체 arg0)
마지막 수업<?>
getClass ()
정수
해시코드 ()
최종 무효
알림 ()
최종 무효
통지모두 ()
toString ()
최종 무효
대기 (long arg0, int arg1)
최종 무효
기다리세요 (긴 arg0)
최종 무효
기다리다 ()
org.tensorflow.op.Op 에서
추상 실행환경
환경 ()
이 작업이 생성된 실행 환경을 반환합니다.
추상적인 작업
op ()
이 계산 단위를 단일 Operation 으로 반환합니다.

상수

공개 정적 최종 문자열 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)