Quantize

کلاس نهایی عمومی Quantize

تانسور «ورودی» از نوع شناور را به تانسور «خروجی» از نوع «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
 
در اینجا «محدوده (T) = محدودیتهای_عددی ::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<T>::min()
 quantized = max(quantized, numeric_limits<T>::min())
 quantized = min(quantized, numeric_limits<T>::max())
 
بزرگترین تفاوت بین این و MIN_COMBINED این است که حداقل محدوده ابتدا گرد می شود، قبل از اینکه از مقدار گرد شده کم شود. با MIN_COMBINED، یک سوگیری کوچک معرفی می‌شود که در آن تکرارهای مکرر کوانتیزه‌سازی و کمی‌سازی خطای بزرگ‌تر و بزرگ‌تری ایجاد می‌کند.

حالت SCALED مثال

حالت «مقیاس‌شده» با رویکرد کمی‌سازی مورد استفاده در «QuantizeAndDequantize{V2|V3}» مطابقت دارد.

اگر حالت "مقیاس" باشد، کمی سازی با ضرب هر مقدار ورودی در یک scaling_factor انجام می شود. ضریب_مقیاس‌سازی از «مین_محدوده» و «محدوده_حداکثر» تعیین می‌شود تا حد امکان بزرگ باشد به طوری که محدوده «مین_محدوده» تا «محدوده_حداکثر» در مقادیر نوع T قابل نمایش باشد.

const int min_T = std::numeric_limits<T>::min();
   const int max_T = std::numeric_limits<T>::max();
   const float max_float = std::numeric_limits<float>::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)
 
«مین_محدوده» و «حداکثر_محدوده» تنظیم شده به عنوان خروجی های 2 و 3 این عملیات برگردانده می شوند. این خروجی ها باید به عنوان محدوده برای هر گونه محاسبات بیشتر استفاده شوند.

خصیصه narrow_range (bool).

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

ویژگی محور (int).

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

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

اگر «محور»=هیچ‌کدام، کوانتیزاسیون هر تانسور به طور معمول انجام می‌شود.

ویژگی sure_minimum_range (float).

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

کلاس های تو در تو

کلاس Quantize.Options ویژگی های اختیاری برای Quantize

ثابت ها

رشته OP_NAME نام این عملیات، همانطور که توسط موتور هسته TensorFlow شناخته می شود

روش های عمومی

استاتیک Quantize.Options
محور (محور طولانی)
استاتیک <T گسترش TType > Quantize <T>
ایجاد (حوزه دامنه ، عملوند < TFloat32 > ورودی، عملوند < TFloat32 > محدوده کوچک، عملوند < TFloat32 > حداکثر دامنه، کلاس<T> T، گزینه‌ها... )
روش کارخانه برای ایجاد یک کلاس که یک عملیات Quantize جدید را بسته بندی می کند.
استاتیک Quantize.Options
تضمین MinimumRange (فلوت تضمین MinimumRange)
استاتیک Quantize.Options
حالت (حالت رشته ای)
استاتیک Quantize.Options
محدوده باریک (محدوده باریک بولی)
خروجی <T>
خروجی ()
داده های کوانتیزه تولید شده از ورودی شناور.
خروجی < TFloat32 >
خروجی حداکثر ()
حداکثر دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود.
خروجی < TFloat32 >
خروجی حداقل ()
حداقل دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس بندی و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود.
استاتیک Quantize.Options
roundMode (String roundMode)

روش های ارثی

ثابت ها

رشته نهایی ثابت عمومی OP_NAME

نام این عملیات، همانطور که توسط موتور هسته TensorFlow شناخته می شود

مقدار ثابت: "QuantizeV2"

روش های عمومی

محور عمومی استاتیک Quantize.Options (محور طولانی)

عمومی استاتیک Quantize <T> ایجاد ( دامنه دامنه ، عملوند < TFloat32 > ورودی، عملوند < TFloat32 > محدوده منتهی، عملوند < TFloat32 > maxRange، کلاس<T> T، گزینه‌ها... )

روش کارخانه برای ایجاد یک کلاس که یک عملیات Quantize جدید را بسته بندی می کند.

پارامترها
دامنه محدوده فعلی
Min Range حداقل مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده به "output_min" نوشته می شود. اگر ویژگی «محور» مشخص شده باشد، این باید یک تانسور 1 بعدی باشد که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت داشته باشد.
حداکثر دامنه حداکثر مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده به "output_max" نوشته می شود. اگر ویژگی «محور» مشخص شده باشد، این باید یک تانسور 1 بعدی باشد که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت داشته باشد.
گزینه ها مقادیر ویژگی های اختیاری را حمل می کند
برمی گرداند
  • نمونه جدیدی از Quantize

استاتیک عمومی Quantize.Options تضمین MinimumRange (فلوات تضمین MinimumRange)

حالت Quantize.Options ثابت عمومی (حالت رشته)

استاتیک عمومی Quantize. Options narrowRange (Bolean narrowRange)

خروجی عمومی <T> خروجی ()

داده های کوانتیزه تولید شده از ورودی شناور.

خروجی عمومی < TFloat32 > outputMax ()

حداکثر دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. اگر ویژگی «محور» مشخص شده باشد، این یک تانسور 1 بعدی خواهد بود که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت دارد.

خروجی عمومی < TFloat32 > outputMin ()

حداقل دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس بندی و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. اگر ویژگی «محور» مشخص شده باشد، این یک تانسور 1 بعدی خواهد بود که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت دارد.

عمومی استاتیک Quantize.Options roundMode (String roundMode)