텐서플로우:: 작전:: 퀀타이즈V2

#include <array_ops.h>

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

여기서 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 모드는 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)

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

인수:

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

보고:

  • Output 출력: 부동 소수점 입력에서 생성된 양자화된 데이터입니다.
  • Output 출력_최소: 출력에 사용되는 실제 최소 스칼라 값입니다.
  • 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)

구조체

텐서플로우:: ops:: QuantizeV2:: 속성

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
)