تانسور «ورودی» از نوع شناور را به تانسور «خروجی» از نوع «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
مثال حالت 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())
حالت 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);
min_range = min_T / scale_factor;
max_range = max_T / scale_factor;
بنابراین مقادیر ورودی را در محدوده (-10، 9.921875) تا (128-127) کوانتیزه می کنیم.
اکنون میتوان تانسور ورودی را با برش مقادیر در محدوده «min_range» تا «max_range» کمیسازی کرد، سپس در scale_factor به صورت زیر ضرب کرد:
result = round(min(max_range, max(min_range, input)) * scale_factor)
خصیصه 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> | |
استاتیک Quantize.Options | تضمین MinimumRange (فلوت تضمین MinimumRange) |
استاتیک Quantize.Options | حالت (حالت رشته ای) |
استاتیک Quantize.Options | محدوده باریک (محدوده باریک بولی) |
خروجی <T> | خروجی () داده های کوانتیزه تولید شده از ورودی شناور. |
خروجی < TFloat32 > | خروجی حداکثر () حداکثر دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. |
خروجی < TFloat32 > | خروجی حداقل () حداقل دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس بندی و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. |
استاتیک Quantize.Options | roundMode (String roundMode) |
روش های ارثی
ثابت ها
رشته نهایی ثابت عمومی OP_NAME
نام این عملیات، همانطور که توسط موتور هسته TensorFlow شناخته می شود
روش های عمومی
عمومی استاتیک Quantize <T> ایجاد ( دامنه دامنه ، عملوند < TFloat32 > ورودی، عملوند < TFloat32 > محدوده منتهی، عملوند < TFloat32 > maxRange، کلاس<T> T، گزینهها... )
روش کارخانه برای ایجاد یک کلاس که یک عملیات Quantize جدید را بسته بندی می کند.
پارامترها
دامنه | محدوده فعلی |
---|---|
Min Range | حداقل مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده به "output_min" نوشته می شود. اگر ویژگی «محور» مشخص شده باشد، این باید یک تانسور 1 بعدی باشد که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت داشته باشد. |
حداکثر دامنه | حداکثر مقدار محدوده کوانتیزاسیون. این مقدار ممکن است بسته به پارامترهای دیگر توسط op تنظیم شود. مقدار تنظیم شده به "output_max" نوشته می شود. اگر ویژگی «محور» مشخص شده باشد، این باید یک تانسور 1 بعدی باشد که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت داشته باشد. |
گزینه ها | مقادیر ویژگی های اختیاری را حمل می کند |
برمی گرداند
- نمونه جدیدی از Quantize
خروجی عمومی < TFloat32 > outputMax ()
حداکثر دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. اگر ویژگی «محور» مشخص شده باشد، این یک تانسور 1 بعدی خواهد بود که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت دارد.
خروجی عمومی < TFloat32 > outputMin ()
حداقل دامنه کوانتیزاسیون نهایی، برای برش مقادیر ورودی قبل از مقیاس بندی و گرد کردن آنها به مقادیر کوانتیزه استفاده می شود. اگر ویژگی «محور» مشخص شده باشد، این یک تانسور 1 بعدی خواهد بود که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت دارد.