قم بقياس موتر "الإدخال" من النوع float إلى موتر "الإخراج" من النوع "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. سيؤدي القياس الكمي من التعويم إلى 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}`.
إذا كان الوضع `SCALED`، فسيتم إجراء القياس الكمي عن طريق ضرب كل قيمة إدخال في عامل القياس. يتم تحديد عامل القياس من `min_range` و`max_range` ليكون أكبر حجم ممكن بحيث يمكن تمثيل النطاق من `min_range` إلى `max_range` ضمن قيم من النوع 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"، ثم الضرب في عامل القياس كما يلي:
result = round(min(max_range, max(min_range, input)) * scale_factor)
سمة النطاق الضيق (منطقي).
إذا كان هذا صحيحا، فإننا لا نستخدم الحد الأدنى من القيمة الكمية. على سبيل المثال، بالنسبة للإخراج الكمي int8، فإنه سيقتصر على النطاق -127..127 بدلاً من النطاق الكامل -128..127. يتم توفير ذلك للتوافق مع بعض الواجهات الخلفية للاستدلال. (ينطبق فقط على وضع SCALED)
سمة المحور (int).
يمكن لسمة "المحور" الاختيارية تحديد فهرس البعد لموتر الإدخال، بحيث سيتم حساب نطاقات التكميم وتطبيقها بشكل منفصل على كل شريحة من الموتر على طول هذا البعد. وهذا مفيد للتكميم لكل قناة.
إذا تم تحديد المحور، min_range وmax_range
إذا كان `المحور`=لا شيء، فسيتم إجراء التكميم لكل موتر كالمعتاد.
سمة ضمان_الحد الأدنى_للنطاق (العائم).
يضمن أن الحد الأدنى لنطاق التكميم هو هذه القيمة على الأقل. القيمة الافتراضية القديمة لهذا هي 0.01، ولكن يُقترح بشدة تعيينها على 0 للاستخدامات الجديدة.
فئات متداخلة
فصل | Quantize.Options | سمات اختيارية ل Quantize |
الثوابت
خيط | OP_NAME | اسم هذه العملية كما هو معروف بواسطة محرك TensorFlow الأساسي |
الأساليب العامة
Quantize.Options ثابت | المحور (المحور الطويل) |
ثابت <T يمتد TType > تكمي <T> | |
Quantize.Options ثابت | ضمان الحد الأدنى (تعويم ضمان الحد الأدنى) |
Quantize.Options ثابت | الوضع (وضع السلسلة) |
Quantize.Options ثابت | النطاق الضيق (النطاق الضيق المنطقي) |
الإخراج <T> | الإخراج () البيانات الكمية المنتجة من المدخلات العائمة. |
الإخراج <TFloat32> | الناتج ماكس () الحد الأقصى لنطاق التكميم النهائي، المستخدم لقص القيم المدخلة قبل قياسها وتقريبها إلى قيم مكممة. |
الإخراج <TFloat32> | الحد الأدنى للإخراج () الحد الأدنى لنطاق التكميم النهائي، المستخدم لقص القيم المدخلة قبل قياسها وتقريبها إلى قيم مكممة. |
Quantize.Options ثابت | وضع مستدير (وضع دائري سلسلة) |
الطرق الموروثة
الثوابت
السلسلة النهائية الثابتة العامة OP_NAME
اسم هذه العملية كما هو معروف بواسطة محرك TensorFlow الأساسي
الأساليب العامة
إنشاء عام ثابت Quantize <T> (نطاق النطاق ، المعامل < TFloat32 > الإدخال، المعامل < TFloat32 > minRange، المعامل < TFloat32 > maxRange، Class<T> T، خيارات... خيارات)
طريقة المصنع لإنشاء فئة تغلف عملية Quantize جديدة.
حدود
نِطَاق | النطاق الحالي |
---|---|
minRange | الحد الأدنى لقيمة نطاق التكميم. يمكن تعديل هذه القيمة من خلال العملية اعتمادًا على المعلمات الأخرى. تتم كتابة القيمة المعدلة إلى "output_min". إذا تم تحديد سمة "المحور"، فيجب أن يكون موترًا أحادي الأبعاد يتطابق حجمه مع بُعد "المحور" لموترات الإدخال والإخراج. |
maxRange | القيمة القصوى لنطاق التكميم. يمكن تعديل هذه القيمة من خلال العملية اعتمادًا على المعلمات الأخرى. تتم كتابة القيمة المعدلة إلى "output_max". إذا تم تحديد سمة "المحور"، فيجب أن يكون موترًا أحادي الأبعاد يتطابق حجمه مع بُعد "المحور" لموترات الإدخال والإخراج. |
خيارات | يحمل قيم السمات الاختيارية |
المرتجعات
- مثيل جديد من Quantize
الإخراج العام <TFloat32> OutputMax ()
الحد الأقصى لنطاق التكميم النهائي، المستخدم لقص القيم المدخلة قبل قياسها وتقريبها إلى قيم مكممة. إذا تم تحديد سمة "المحور"، فسيكون هذا موترًا أحادي الأبعاد يتطابق حجمه مع بُعد "المحور" لموترات الإدخال والإخراج.
الإخراج العام <TFloat32> OutputMin ()
الحد الأدنى لنطاق التكميم النهائي، المستخدم لقص القيم المدخلة قبل قياسها وتقريبها إلى قيم مكممة. إذا تم تحديد سمة "المحور"، فسيكون هذا موترًا أحادي الأبعاد يتطابق حجمه مع بُعد "المحور" لموترات الإدخال والإخراج.