텐서플로우:: 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 인 경우, 각 입력 값에 스케일링 계수를 곱하여 양자화를 수행합니다. 스케일링 계수는 min_range 와 max_range 를 기준으로 가능한 한 크게 결정되며, min_range 부터 max_range 까지의 범위가 T 타입의 값으로 표현될 수 있도록 합니다.

  

  const int min_T = std::numeric_limits::min();
  const int max_T = std::numeric_limits::max();
  const float max_float = std::numeric_limits::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을 비교하여 scaling_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)

조정된 min_range 와 max_range 는 이 연산의 출력 2와 3으로 반환됩니다. 이러한 출력값을 이후 계산의 범위로 사용해야 합니다.

narrow_range(bool) 속성

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

축(정수) 속성

선택적 axis 속성을 사용하여 입력 텐서의 차원 인덱스를 지정할 수 있습니다. 이렇게 하면 해당 차원을 따라 텐서의 각 슬라이스에 대해 양자화 범위가 개별적으로 계산되고 적용됩니다. 이는 채널별 양자화에 유용합니다.

축이 지정된 경우 min_range와 max_range

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

ensure_minimum_range(float) 속성

최소 양자화 범위가 이 값 이상인지 확인합니다. 기존 기본값은 0.01이지만, 새로운 용도에서는 0으로 설정하는 것이 좋습니다.

논거:

  • 범위: Scope 객체
  • min_range: 양자화 범위의 최소값입니다. 이 값은 다른 매개변수에 따라 연산자가 조정할 수 있습니다. 조정된 값은 output_min 에 기록됩니다. axis 속성이 지정된 경우, 이 값은 입력 및 출력 텐서의 axis 차원과 크기가 일치하는 1차원 텐서여야 합니다.
  • max_range: 양자화 범위의 최대값입니다. 이 값은 다른 매개변수에 따라 연산자가 조정할 수 있습니다. 조정된 값은 output_max 에 기록됩니다. axis 속성이 지정된 경우, 이 값은 입력 및 출력 텐서의 axis 차원과 크기가 일치하는 1차원 텐서여야 합니다.

보고:

  • Output : 부동소수점 입력으로부터 생성된 양자화된 데이터.
  • Output output_min: 최종 양자화 범위의 최소값으로, 입력값을 스케일링 및 반올림하여 양자화된 값으로 만들기 전에 입력값을 제한하는 데 사용됩니다. axis 속성이 지정된 경우, 이 값은 입력 및 출력 텐서의 axis 차원과 동일한 크기의 1차원 텐서가 됩니다.
  • Output output_max: 최종 양자화 범위의 최대값으로, 입력값을 스케일링 및 반올림하여 양자화된 값으로 만들기 전에 입력값을 제한하는 데 사용됩니다. axis 속성이 지정된 경우, 이 값은 입력 및 출력 텐서의 axis 차원과 동일한 크기의 1차원 텐서가 됩니다.

생성자와 소멸자

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

공개 정적 함수

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool 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 Axis(
  int64 x
)

최소 범위 보장

Attrs EnsureMinimumRange(
  float x
)

방법

Attrs Mode(
  StringPiece x
)

내로우 레인지

Attrs NarrowRange(
  bool x
)

라운드모드

Attrs RoundMode(
  StringPiece x
)