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
이면 각 입력 값에 scaling_factor를 곱하여 양자화가 수행됩니다. scaling_factor은 판정 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으로 반환됩니다. 이러한 출력은 추가 계산을위한 범위로 사용해야합니다.좁은 _ 범위 (bool) 속성
참이면 최소 양자화 값을 사용하지 않습니다. 즉, int8의 경우 양자화 된 출력은 전체 -128..127 범위 대신 -127..127 범위로 제한됩니다. 특정 추론 백엔드와의 호환성을 위해 제공됩니다. (SCALED 모드에만 적용)
축 (int) 속성
선택적
axis
속성은 입력 텐서의 차원 인덱스를 지정하여 해당 차원을 따라 텐서의 각 조각에 대해 양자화 범위가 별도로 계산되고 적용되도록 할 수 있습니다. 이는 채널 별 양자화에 유용합니다.축이 지정되면 min_range 및 max_range
axis
= None이면 텐서 별 양자화가 정상적으로 수행됩니다.ensure_minimum_range (float) 속성
최소 양자화 범위가이 값 이상인지 확인합니다. 이에 대한 레거시 기본값은 0.01이지만 새로운 사용을 위해 0으로 설정하는 것이 좋습니다.
인수 :
- 범위 : 범위 개체
- min_range : 양자화 범위의 최소값. 이 값은 다른 매개 변수에 따라 op에 의해 조정될 수 있습니다. 조정 된 값은
output_min
기록됩니다.axis
속성이 지정된 경우 이는 크기가 입력 및 출력 텐서의axis
차원과 일치하는 1 차원 텐서 여야합니다. - max_range : 양자화 범위의 최대 값. 이 값은 다른 매개 변수에 따라 op에 의해 조정될 수 있습니다. 조정 된 값은
output_max
기록됩니다.axis
속성이 지정된 경우 이는 크기가 입력 및 출력 텐서의axis
차원과 일치하는 1D 텐서 여야합니다.
보고:
-
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) |
구조체 | |
---|---|
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 Axis( int64 x )
ensureMinimumRange
Attrs EnsureMinimumRange( float x )
방법
Attrs Mode( StringPiece x )
좁은 범위
Attrs NarrowRange( bool x )
RoundMode
Attrs RoundMode( StringPiece x )