7.8. إدخال/إخراج الموترات¶
يقبل المحرك موترًا واحدًا على جانب الإدخال ويُنتج موترًا واحدًا أو أكثر على جانب الإخراج. الموترات هي كائنات ndarray بالشكل ونوع البيانات ومفردات الواصف التي قدّمها فصل numpy. تأتي أشكالها وأنواع بياناتها من ملف النموذج ويُبلَّغ عنها عبر input_shape / output_shape و input_dtype / output_dtype.
7.8.1. التكميم (Quantization)¶
تعمل معظم الشبكات التي تُشغّلها الكاميرا على موترات صحيحة مُكمّمة -- int8 أو uint8 -- لكي تتسع ضمن ذاكرة RAN وميزانية الحوسبة للكاميرا. يحمل الموتر المُكمّم قيمًا صحيحة تمثل أعدادًا ذات قيم حقيقية عبر معامل قياس ونقطة صفر لكل موتر:
يأتي معامل القياس ونقطة الصفر من معايرة الشبكة في وقت التدريب ويُخزَّنان في ملف النموذج. وهما مكشوفان كـ input_scale، و input_zero_point، و output_scale، و output_zero_point -- كل منها قائمة بمدخل واحد لكل موتر إدخال أو إخراج.
ml.utils.quantize() و ml.utils.dequantize() تطبّقان الصيغتين على فهرس إخراج محدد:
import ml.utils
real_tensor = ml.utils.dequantize(model, q_tensor, index=0)
q_tensor = ml.utils.quantize(model, real_tensor, index=0)
تُعيد كلتا الدالتين القيمة دون تغيير عندما يكون نوع بيانات الإخراج عند الفهرس المعطى عشريًا أصلًا، لذا فالاستدعاء آمن بصرف النظر عن حالة تكميم النموذج.
7.8.2. ما يراه البرنامج النصي على جانب الإخراج¶
يعتمد ما تُعيده predict() على ما إذا كان هناك معالِج لاحق مُسجَّل.
بدون معالِج لاحق، تُلغى تكميم مخرجات المحرك الصحيحة الخام تلقائيًا إلى الفاصلة العائمة وتُعاد كقائمة من كائنات ndarray العشرية. يتلقى البرنامج النصي أعدادًا ذات قيم حقيقية جاهزة للقراءة. هذا هو المسار الصحيح لشبكات التصنيف، التي يكون موتر إخراجها الوحيد بالفعل قائمة درجات ثقة لكل صنف يكرّرها التطبيق -- دون الحاجة إلى خطوة فك ترميز. وهو أيضًا المسار السهل لتشغيل نموذج مجهول بسرعة أو للفحص العَرَضي من الـ REPL.
مع وجود معالِج لاحق مُسجَّل (عبر postprocess= على المُنشئ أو callback= على استدعاء predict)، تُسلَّم الموترات المُكمّمة الخام إلى الكائن القابل للاستدعاء للمعالِج اللاحق مباشرةً. يتلقى المعالِج اللاحق الموترات المُكمّمة الخام ويكون مسؤولًا عن أي إلغاء تكميم يحتاجه.
هذا الانقسام خيار يتعلق بالأداء. يخصّص إلغاء التكميم التلقائي موترًا عشريًا جديدًا لكل مخرج ويمرّ على كل عنصر. أما المعالِج اللاحق الذي يحتاج فقط إلى قيم قليلة من كل موتر -- إخضاع درجات الثقة لعتبة، ثم فك ترميز المربعات للناجين -- فيتخطى كلفة إلغاء تكميم الباقي. وكل فاكّات ترميز المربعات المشحونة ضمن ml.postprocessing تسلك هذا الطريق، و ml.utils.threshold() مبنية تحديدًا لهذه الحالة: فهي تأخذ موتر درجات مُكمّمًا وتُعيد الفهارس التي تجتاز قيمها المُلغى تكميمها عتبةً ذات قيمة حقيقية، دون إلغاء تكميم الموتر بالكامل.