تانسور «ورودی» از نوع شناور را به تانسور «خروجی» از نوع «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) = numeric_limitsمثال حالت 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 انجام می شود. scaling_factor از "min_range" و "max_range" تا حد امکان بزرگ تعیین می شود، به طوری که محدوده "min_range" تا "max_range" در مقادیر نوع
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);
قابل نمایش است. 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» کمیسازی کرد، سپس در
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 بعدی خواهد بود که اندازه آن با بعد «محور» تانسورهای ورودی و خروجی مطابقت دارد.