التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء الثامن
Deep Learning for Computer Vision- part 8
بعد أن تعلمنا كيفية إنشاء وتنفيذ شبكة عصبية إصطناعية من نوع (CNN) وذلك لتدريب نموذج يقوم بمهمة تصنيف الصور (Image classification), حيث قمنا في المقالتين السابقتين بإنشاء وتدريب نموذجين يقومان بمهمة تصنيف الصور التي تحتوي على أرقام مكتوبة بخط اليد (Handwritten digits), حيث إنَّ النموذج الأول يقوم بتصنيف الصور ذات الأرقام الإنجليزية, والثاني يقوم بتصنيف الصور ذات الأرقام العربية, وقد حصلنا على دقة (%98) تقريباً لكلا النموذجين. في هذه المقالة سوف نتطرق إلى أحد طرق زيادة الدقة (Accuracy) للنماذج وهي طريقة زيادة حقب التدريب (Epochs).
زيادة دقة التصنيف بزيادة حقب التدريب
Increase Accuracy by increasing Training Epochs
النموذج الأول:
نبدأ أولاً بالنموذج الذي أنشأناه في المقالة السابعة بإستخدام مكتبة (Tensorflow) حيث سنقوم بإجراء بعض التغييرات في الكود لأجل زيادة تكرار بيانات التدريب لضعفين , حيث قمنا بتكرار بيانات التدريب في المثال السايق (10) مرات أما هنا فسوف نقوم بتكرار البيانات (20) مرة, كما قمنا بتغيير نسبة الإهمال في الطبقة (Dropout) من (0.4) إلى (0.5), وقد أحطنا القيم التي قمنا بتغييرها بمستطيلين. وكما مبين في الكود التالي:
وبعد تنفيذ الكود بعد التعديل نحصل على النتيجة التالية:
نلاحظ إننا قد حصلنا على دقة تزيد عن (99 %) وهذا يعتبر تطور جيد.
حفظ النماذج المدربة وإستعادتها
(Save and load models)
يمكننا الإحتفاظ بالنموذج بعد تدريبه والحصول على الدقة المطلوبة منه وذلك لكي يمكننا إستعادته في أي وقت نحتاجه لأجل إستخدامه في أي تطبيق آخر مستقبلاً من قبلنا أو يستخدمه أشخاصاً آخرين, كذلك يمكننا تقطيع الفترة الزمنية للتدريب, أي يمكننا أن نجعل عملية التدريب تتم على مراحل لتجنب أوقات التدريب الطويلة, حيث إن عملية التدريب تستأنف من حيث توقفت.
نبدأ الآن بالنموذج الذي أنشأناه ودربناه في الفقرة السابقة:
عملية حفظ النموذج المدرب Saving a model
إنَّ النموذج الذي قمنا بتدريبه يمكننا الآن حفظه وذلك بإستخدام الدالة (save()) التابعة إلى مكتبة (keras), حيث نقوم بإستدعائها بعد عملية التدريب مباشرةً وكما موضح في الشكل التالي:
حيث نقوم بإعطاء هذه الدالة المسار الذي يفترض أن يحفظ فيه النموذج وكذلك إسم الملف والذي يكون إمتداده (.h5). حيث قمنا بإعطاءه مساراً داخل مجلد التطبيق, ويمكننا وضعه في أي مكان آخر نختاره.
بعد تنفيذ الكود سوف نلاحظ ظهور ملف يضاف الى مجموعة التطبيق في الجهة اليسرى من بيئة العمل (أنا أستخدمت بيئة العمل Jupyter), وهذا الملف الجديد هو (handwritten_digits_model.h5).وكما موضح في الشكل أدناه:
عملية إستعادة النموذج :
يمكننا الآن إستعادة النموذج الذي قمنا بحفظه في الخطوة السابقة وذلك عن طريق إستخدام الدالة (load_model()) التابعة إلى مكتبة (tf.keras), حيث نقوم بتمرير إسم الملف الذي حفظنا فيه النموذج.
الشكل التالي يوضح الكود الخاص بكيفية إستعادة النموذج وكذلك لإظهار معمارية الشبكة من حيث أنواع الطبقات المستخدمة وكذلك العناصر الواجب تدريبها:
السطر رقم (1): لإستعادة النموذج الذي قمنا بحفظة في الملف (handwritten_digits_model.h5) وذلك عن طريق الدالة (load_model).
السطر رقم (2): لعرض موجز عن النموذج بعد إستعادته. وبعد تنفيذ الكود نحصل على الشكل التالي:
إستخدام النموذج المستعاد في تصنيف صور جديدة:
يمكننا الآن إستخدام نموذجنا المدرب والذي قمنا بإستعادته من الملف (handwritten_digits_model.h5), حيث نستخدمه الآن للتعرف على صور جديدة تحتوي على أرقام قمنا نحن بكتابتها وإيداعها بمجموعة من الصور بإمتداد (.png) وقد قمنا بوضع هذه الصور في مجلد سميناه (data) ووضعناه في داخل التطبيق.
والشكل التالي يبين هذه الصور الجديدة:
والآن نقوم بكتابة الكود المناسب لكي يقوم النموذج المستعاد بتشخيص الصور الأربعة أعلاه وأعطاءها التسميات المناسبة (labels), وكذلك نقوم بكتابة كود إضافي لكي تظهر هذه التسميات على نفس الصور وباللون الأحمر, والكود موضح بالشكل الآتي:شرح الكود:
الأسطر من (1) لغاية (4): لإستدعاء المكتبات الضرورية, ومن المكتبات التي إستدعيناها مكتبة (Pillow), وعن طريقها إستدعينا الكلاس (Image) والذي سوف نستخدمه في قراءة بيانات الصور من الملفات.
السطر رقم (6): قمنا بتحميل مكونات النموذج المحفوظة في الملف (handwritten_digits_model.h5) عن طريق الدالة (load_model).
السطر رقم (1): نقوم بتحديد المساحة التي سوف تعرض فيها الصور.
السطر رقم (2): تحديد عدد الصور التي سوف تعرض.
السطر رقم (3): إنشاء حلقة تكرارية لأربع مرات بعدد الصور.
السطر رقم (4): قراءة بيانات إحدى الصور الموجودة في المجلد (data) وذلك عن طريق الكلاس (Image).
السطر رقم (5): تغيير حجم الصورة التي تمت قراءة بياناتها إلى إرتفاع (28 pixle) وعرض (28 pixle) أيضاً, وذلك لأن نموذجنا مدرب على هكذا أحجام الصور وسوف نقوم بتغيير الشكل أيضا ليصبح متلائم مع النموذج.
السطر رقم (6): تحويل بيانات الصورة إلى مصفوفة نوع (Numpy) لكي نستطبع تغيير شكلها لاحقاً.
السطر رقم (7): نقوم بإضافة بعدين إضافيين للصورة لتصبح (1, 28, 28, 1) أي ذات أربعة أبعاد لكي تكون جاهزة لإدخالها على النموذج لأجل القيام بتصنيفها.
السطر رقم (8): الحصول على التسمية المتوقعة من النموذج وذلك من خلال الدالة (predict) حيث نقوم بتمرير بيانات الصورة بعد إكتمال جاهزيتها من خلال الخطوات السابقة من الكود.
السطر رقم (9): تحويل التسمية التي حصلنا عليها من صيغة (One_hot encoded) إلى الصيغة العادية.
وبعد تنفيذ الكود نحصل على مايلي:
وبذلك نكون قد إنتهينا من هذه المقالة, حيث قمنا أولاً بإستخدام أحد الطرق لزيادة الدقة للنموذج, بعدها تطرقنا إلى موضوع كيفية حفظ النموذج المدرب في ملف خاص ذو إمتداد (h5) وكذلك تطرقنا إلى كيفيىة إستعادة هذا النموذج وكيفية تهيئته لغرض إستخدامه في عملية التوقع (Prediction).
حسن فنجان عداي
تعليقات
إرسال تعليق