7.4. تحميل نموذج¶
ml.Model يقرأ ملف نموذج من ذاكرة فلاش، ويحلّله، ويخصّص ذاكرة RAM التي تحتاجها الشبكة أثناء الاستدلال، ويُعيد كائنًا يحمل كل ما تحتاج بقية البرنامج النصي معرفته عن الشبكة المحمّلة.
7.4.1. المُنشئ (constructor)¶
يأخذ المُنشئ مسارًا ومعالِجًا لاحقًا اختياريًا:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
تُقرأ النماذج الموجودة على /rom/ (نظام الملفات المقيم في ذاكرة فلاش) في مكانها: تبقى أوزان الشبكة في ذاكرة فلاش ولا يستهلك النموذج المحمّل سوى قدر ساحة الموتر (tensor arena) من ذاكرة RAM. أما النماذج الموجودة على /sdcard/ فتُنسخ إلى ذاكرة RAM وقت التحميل، فتكون التكلفة الإجمالية هي حجم ملف النموذج مضافًا إليه ساحة الموتر. كلا المسارين يعمل؛ والمفاضلة تكون في ذاكرة RAM.
إذا وُجد ملف .txt شقيق يحمل الاسم الأساسي نفسه، فإن محتوياته تُحمَّل تلقائيًا إلى labels. تُسجّل الكلمة المفتاحية postprocess= كائنًا قابلًا للاستدعاء تُشغّله predict() بعد كل استدلال.
7.4.2. الخصائص المخصصة للقراءة فقط¶
يعرض النموذج المحمّل مجموعة صغيرة من الخصائص المخصصة للقراءة فقط، تصف الشبكة دون أن يُشغّلها أحد.
الملف والذاكرة.
len-- حجم ملف النموذج على القرص، بالبايت.ram-- حجم ساحة الموتر (tensor arena) التي تحتاجها الشبكة لتنشيطاتها الوسيطة أثناء الاستدلال، بالبايت.
موترات الإدخال.
input_shape-- قائمة من الصفوف (tuples)، واحد لكل موتر إدخال، تُعطي الشكل الذي تتوقعه الشبكة. تمتلك شبكات الرؤية إدخالًا واحدًا بالشكل(1, H, W, C).input_dtype-- قائمة من رموز نوع البيانات أحادية الحرف ('b'int8،'B'uint8،'h'int16،'H'uint16،'f'float32)، واحد لكل إدخال.input_scaleوinput_zero_point-- معاملات التكميم (quantization) التي تحوّل بين الإدخال ذي القيم الحقيقية الذي دُرّبت عليه الشبكة والتمثيل الصحيح الذي تعمل به الكاميرا.
موترات الإخراج. مرآة لمجموعة الإدخال: output_shape، output_dtype، output_scale، output_zero_point. تُنتج شبكات الكشف موترين أو ثلاثة موترات إخراج (المربعات، ودرجات الثقة، وأحيانًا احتمالات الأصناف)؛ بينما تُنتج شبكات التصنيف موترًا واحدًا.
إضافات. labels هي قائمة أسماء الأصناف المحمّلة من ملف .txt الشقيق، أو None. postprocess هي المعالِج اللاحق المُسجَّل، أو None.
7.4.3. فحص BlazeFace¶
إن تحميل نموذج BlazeFace المُرفق وطباعة كل خاصية يُعطي الأرقام الفعلية:
import ml
from ml.postprocessing.mediapipe import BlazeFace
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
print("file size: ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape: ", model.input_shape)
print("input dtype: ", model.input_dtype)
print("input scale: ", model.input_scale)
print("input zp: ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp: ", model.output_zero_point)
تُحدّد الأرقام واجهة الشبكة بشكل ملموس: موتر إدخال واحد int8 بالشكل (1, 128, 128, 3) وموترا إخراج int8 -- أحدهما لمعاملات انحدار المربعات، والآخر لدرجات الثقة لكل مرساة (anchor). تصف معاملات التكميم كيفية ربط قيم int8 هذه بالأعداد العشرية الحقيقية التي دُرّبت عليها الشبكة؛ ويستخدمها المعالِج اللاحق لإلغاء التكميم قبل فك ترميز المربعات.
كل خاصية هي المصدر الوحيد للحقيقة بشأن ما تصفه. تقرأ البرامج النصية input_shape لمعرفة ما يجب التقاطه، وتقرأ output_scale و output_zero_point لفك ترميز الموترات يدويًا، وتقرأ labels للحصول على أسماء أصناف قابلة للقراءة البشرية -- لا تُكتب يدويًا بشكل ثابت، ولا تُفترض أبدًا.