텐서플로우:: ops:: QuantizeV2

#include <array_ops.h>

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

요약

[min_range, max_range]는 '입력' 데이터의 범위를 지정하는 스칼라 부동 소수점 값입니다. 'mode' 속성은 부동 소수점 값을 양자화된 값으로 변환하는 데 사용되는 계산 방식을 정확하게 제어합니다. '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

여기서 range(T) = numeric_limits ::max() - numeric_limits ::min()

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])인 경우, 값의 범위가 qint8의 범위와 일치하도록 캐스팅하기 전에 각 값에서 128을 추가로 뺍니다.

모드가 '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::min()
quantized = max(quantized, numeric_limits::min())
quantized = min(quantized, numeric_limits::max())

이 방법과 MIN_COMBINED 방법의 가장 큰 차이점은 최소 범위 값을 먼저 반올림한 후, 반올림된 값에서 빼는 것입니다. MIN_COMBINED 방법에서는 작은 편향이 발생하는데, 양자화 및 역양자화 과정을 반복할수록 오차가 점점 커집니다.

확장 모드 예시

SCALED 모드는 QuantizeAndDequantize{V2|V3} 에서 사용되는 양자화 방식과 일치합니다.

모드가 SCALED 인 경우 출력 유형의 전체 범위를 사용하지 않고 대칭을 위해 가능한 가장 낮은 값을 생략합니다(예: 부호 있는 8비트 양자화의 경우 출력 범위는 -127~127이며 -128~127이 아님). 따라서 0.0은 0으로 매핑됩니다.

먼저 텐서의 값 범위를 찾습니다. 우리가 사용하는 범위는 항상 0을 중심으로 하므로, 다음과 같은 m 값을 찾습니다.

  m = max(abs(input_min), abs(input_max))

입력 텐서의 범위는 [-m, m] 입니다.

다음으로, 고정 소수점 양자화 버킷 [min_fixed, max_fixed] 을 선택합니다. T가 부호 있는 숫자인 경우, 이는 다음과 같습니다.

  num_bits = sizeof(T) * 8
  [min_fixed, max_fixed] =
      [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]

그렇지 않고 T가 부호 없는 정수이면 고정 소수점 범위는 다음과 같습니다.

  [min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

이를 통해 스케일링 계수 s를 계산합니다.

  s = (max_fixed - min_fixed) / (2 * m)

이제 텐서의 요소들을 양자화할 수 있습니다.

result = round(input * s)

주의해야 할 점은 양자화 과정에서 운영자가 요청된 최소값과 최대값을 약간 조정할 수 있다는 것입니다. 따라서 항상 출력 포트를 추가 계산 범위로 사용해야 합니다. 예를 들어, 요청된 최소값과 최대값이 거의 같을 경우, 잘못된 양자화 버퍼 생성을 방지하기 위해 작은 엡실론 값으로 구분됩니다. 그렇지 않으면 모든 양자화 값이 동일한 부동 소수점 값으로 매핑되는 버퍼가 생성되어 해당 버퍼에 대한 추가 계산을 수행해야 하는 작업에 문제가 발생할 수 있습니다.

논거:

  • 범위: Scope 객체
  • min_range: 입력에 대해 생성될 수 있는 최소 스칼라 값입니다.
  • max_range: 입력에 대해 생성될 수 있는 최대 스칼라 값입니다.

보고:

  • Output : 부동소수점 입력으로부터 생성된 양자화된 데이터.
  • Output output_min: 출력에 사용된 실제 최소 스칼라 값입니다.
  • Output output_max: 출력에 사용된 실제 최대 스칼라 값입니다.

생성자와 소멸자

QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T)
QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs)

공개 속성

operation
output
output_max
output_min

공개 정적 함수

Mode (StringPiece x)
RoundMode (StringPiece x)

구조

텐서플로우:: ops:: QuantizeV2:: Attrs

QuantizeV2 에 대한 선택적 속성 설정기입니다.

공개 속성

작업

Operation operation

산출

::tensorflow::Output output

출력 최대값

::tensorflow::Output output_max

출력_최소

::tensorflow::Output output_min

공공 기능

양자화V2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

양자화V2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

공개 정적 함수

방법

Attrs Mode(
  StringPiece x
)

라운드모드

Attrs RoundMode(
  StringPiece x
)