tensorflow:: عملیات:: کوانتیزه کردن V2

#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()

مثال حالت 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 همسو شود.

اگر حالت '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 باشد، کوانتیزاسیون با ضرب هر مقدار ورودی در یک 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 تنظیم‌شده به عنوان خروجی‌های ۲ و ۳ این عملیات بازگردانده می‌شوند. این خروجی‌ها باید به عنوان محدوده برای هرگونه محاسبات بیشتر استفاده شوند.

ویژگی narrow_range (بولی)

اگر درست باشد، از حداقل مقدار کوانتیزه شده استفاده نمی‌کنیم. یعنی برای int8 خروجی کوانتیزه شده، به جای محدوده کامل -128..127، به محدوده -127..127 محدود می‌شود. این برای سازگاری با برخی از backendهای استنتاج ارائه شده است. (فقط در حالت SCALED اعمال می‌شود)

ویژگی محور (عدد صحیح)

یک ویژگی axis اختیاری می‌تواند یک شاخص بُعد از تانسور ورودی را مشخص کند، به طوری که محدوده‌های کوانتیزاسیون برای هر برش از تانسور در امتداد آن بُعد به طور جداگانه محاسبه و اعمال شوند. این برای کوانتیزاسیون در هر کانال مفید است.

اگر محور مشخص شده باشد، min_range و max_range

اگر axis = None باشد، کوانتیزاسیون per-tansor به صورت عادی انجام می‌شود.

ویژگی ensure_minimum_range (اعداد شناور)

تضمین می‌کند که حداقل محدوده کوانتیزاسیون حداقل این مقدار باشد. مقدار پیش‌فرض قدیمی برای این مقدار ۰.۰۱ است، اما اکیداً پیشنهاد می‌شود که برای کاربردهای جدید آن را روی ۰ تنظیم کنید.

استدلال‌ها:

  • دامنه: یک شیء دامنه
  • min_range: حداقل مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده در output_min نوشته می‌شود. اگر ویژگی axis مشخص شده باشد، این باید یک تانسور یک بعدی باشد که اندازه آن با axis تانسورهای ورودی و خروجی مطابقت دارد.
  • max_range: حداکثر مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده در output_max نوشته می‌شود. اگر ویژگی axis مشخص شده باشد، این باید یک تانسور یک بعدی باشد که اندازه آن با axis تانسورهای ورودی و خروجی مطابقت دارد.

بازده:

  • Output : داده‌های کوانتیزه شده تولید شده از ورودی اعشاری.
  • Output output_min: حداقل محدوده کوانتیزاسیون نهایی، که برای برش مقادیر ورودی قبل از مقیاس‌بندی و گرد کردن آنها به مقادیر کوانتیزه شده استفاده می‌شود. اگر ویژگی axis مشخص شده باشد، این یک تانسور یک بعدی خواهد بود که اندازه آن axis تانسورهای ورودی و خروجی مطابقت دارد.
  • Output output_max: حداکثر محدوده کوانتیزاسیون نهایی، که برای برش مقادیر ورودی قبل از مقیاس‌بندی و گرد کردن آنها به مقادیر کوانتیزه شده استفاده می‌شود. اگر ویژگی axis مشخص شده باشد، این یک تانسور یک بعدی خواهد بود که اندازه آن axis تانسورهای ورودی و خروجی مطابقت دارد.

سازنده‌ها و مخرب‌ها

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:: عملیات:: 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 Axis(
  int64 x
)

حداقل برد را تضمین کنید

Attrs EnsureMinimumRange(
  float x
)

حالت

Attrs Mode(
  StringPiece x
)

محدوده باریک

Attrs NarrowRange(
  bool x
)

حالت گرد

Attrs RoundMode(
  StringPiece x
)