ML 커뮤니티 데이는 11월 9일입니다! TensorFlow, JAX에서 업데이트를 우리와 함께, 더 자세히 알아보기

tensorflow :: ops :: QuantizeV2

#include <array_ops.h>

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

요약

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

'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() range(T) = numeric_limits ::max() - numeric_limits ::min() 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]) 인 경우이 연산은 캐스팅하기 전에 각 값을 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::min()
quantized = max(quantized, numeric_limits::min())
quantized = min(quantized, numeric_limits::max())

이것과 MIN_COMBINED의 가장 큰 차이점은 반올림 된 값에서 빼기 전에 최소 범위가 먼저 반올림된다는 것입니다. MIN_COMBINED를 사용하면 양자화 및 역 양자화를 반복하면 더 크고 더 큰 오류가 발생하는 작은 편향이 도입됩니다.

SCALED 모드 예

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

모드가 SCALED 이면 대칭에 대해 가능한 가장 낮은 값을 제거하도록 선택하여 출력 유형의 전체 범위를 사용하지 않습니다 (예 : 부호있는 8 비트 양자화의 경우 출력 범위는 -128 ~ 127이 아니라 -127 ~ 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)

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

인수 :

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

보고:

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

생성자와 소멸자

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)

구조체

tensorflow :: ops :: QuantizeV2 :: Attrs

QuantizeV2에 대한 선택적 속성 설정자.

공용 속성

조작

Operation operation

산출

::tensorflow::Output output

output_max

::tensorflow::Output output_max

output_min

::tensorflow::Output output_min

공공 기능

QuantizeV2

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

QuantizeV2

 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
)

RoundMode

Attrs RoundMode(
  StringPiece x
)