جریان تنسور:: عملیات:: QuantizeV2

#include <array_ops.h>

تانسور «ورودی» از نوع شناور را به تانسور «خروجی» از نوع «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() 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 باشد، از طیف کامل نوع خروجی استفاده نمی‌کنیم، و انتخاب می‌کنیم که کمترین مقدار ممکن را برای تقارن حذف کنیم (به عنوان مثال، محدوده خروجی 127- تا 127 است، نه 128- تا 127 برای کوانتیزاسیون 8 بیتی علامت‌دار). به طوری که 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: یک شی 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)

سازه ها

tensorflow:: ops:: QuantizeV2:: Attrs

تنظیم کننده های ویژگی اختیاری برای QuantizeV2 .

صفات عمومی

عمل

Operation operation

خروجی

::tensorflow::Output output

output_max

::tensorflow::Output output_max

خروجی_دقیقه

::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
)

حالت گرد

Attrs RoundMode(
  StringPiece x
)