القائمة الرئيسية

الصفحات

تقنية نقل التعلم Transfer Learning- الجزء الثاني

 

مفهوم نقل التعلم (Transfer Learning) وما هي الغاية منه والفوائد التي نحصل عليها بإستخدامنا لهذه التقنية, وما هي الآليات لتنفيذها, حيث ذكرنا أنَّ هناك آليتان للتنفيذ هما إستخلاص الخصائص (Feature Extraction) والآلية الثانية هي الضبط الدقيق (Fine Tuning), وذكرنا أيضاًّ بأن هناك طريقتان لتنفيذ الآلية الأولى أي (Feature Extraction) وقمنا بشرح مفصل للطريقة الأولى.





تقنية نقل التعلم

(Transfer learning)


الجزء الثاني



المهندس


حسن فنجان عداي

بسم إلله الرحمن الرحيم
تطرقنا في الجزء الأول من هذه المقالة إلى مفهوم نقل التعلم (Transfer Learning) وما هي الغاية منه والفوائد التي نحصل عليها بإستخدامنا لهذه التقنية, وما هي الآليات لتنفيذها, حيث ذكرنا أنَّ هناك آليتان للتنفيذ هما إستخلاص الخصائص (Feature Extraction) والآلية الثانية هي الضبط الدقيق (Fine Tuning), وذكرنا أيضاًّ بأن هناك طريقتان لتنفيذ الآلية الأولى أي (Feature Extraction) وقمنا بشرح مفصل للطريقة الأولى.
في هذا الجزء إنشاء ألله سوف نقوم بشرح تفصيلي للطريقة الثانية.



الطريقة الثانية لتنفيذ إستخلاص الخصائص:
في هذه الطريقة نقوم بدمج المرحلتين معاً اي نقوم بدمج المصنف الخاص بنا (Classifier) قبل تدريبه مع النموذج الأصلي وجعله نموذج واحد ومن ثم نقوم بإدخال بيانات الصور لغرض التدريب.
هذه الطريقة تسمح لنا بإستخدام تقنية الزيادة (Augmentation) ولكنها تستهلك وقتاً كثيراً.
ولنبدأ بتنفيذ هذه الطريقة من خلال إنشاء التطبيق التالي والذي نستخدم فية مجموعة البيانات (cats_vs_dogs) والتي نقوم بتحميلها عن طريق المكتبة المستقلة المسماة  (tensorflow-datasets), و يجب أن نقوم أولاً بتنصيب هذه المكتبة وعن طريق الأداة (pip) حيث نقوم بتشغيل سطر الأوامر الخاص بالبيئة أي (Anaconda prompt) ثم نتحول إلى البيئة التي نعمل عليها ثم نقوم بكتابة الأمر الخاص بتنصيب هذه المكتبة وكما موضح بالصورة التالية:


وبعد أن قمنا بالتنصيب لهذه المكتبة دعونا نتعرف على كيفية إستخدامها في تطبيقنا, حيث نقوم بإستدعاء هذه المكتبة مع بقية المكتبات الضرورية وكما موضح بالكود التالي:


الأسطر من (1لغاية (11): لإستدعاء المكتبات الضرورية ومن ضمنها مكتبة (tensorflow_datasets).


الأسطر من (1لغاية (8): للإعلان عن بعض القيم الثابتة (Hyper-Parameters) للتطبيق.


الأسطر من (1لغاية (6): البدأ بتحميل مجموعة البيانات (cats vs dogs) بإستخدام الدالة (load) التابعة للمكتبة (tensorflow_datasets) حيث نقوم بتمرير المعاملات التالية لها:

1 – إسم المكتبة المراد تحميلها.

2 – النسب التي بموجبها يتم توزيع البيانات على الأقسام الثلاثة (train, validation and test), وذلك لأنَّ هذه المجموعة من البيانات توجد كمجموعة واحدة تحت إسم (train) لذلك يجب علينا توزيعها على المجموعات الفرعية التي نرغب بإنشائها وحسب النسب, فنلاحظ مثلاً إن المجموعة (train) تبدأ من البداية وحتى نسبة    (80 %) وهكذا في بقية المجموعات.

3 – إذا أردنا تضمين هذه البيانات ببعض المعلومات المهمة حولها فيجب تعيين قيمة (with_info = True).

ولأجل التأكد من سلامة ماقمنا به من تحميل للبيانات المطلوبة نقوم بكتابة الكود التالي لعرض بعض من هذه البيانات والتي هي عبارة عن بيانات للصور (Images) وبيانات ما يقابلها من التسميات (Labels) وكما يلي:

السطر رقم (1): لإستخلاص التسمية الصريحة للصنف وليس الرمز عن طريق الدالة (features).
السطر رقم (2): إنشاء حلقة تتكرر بمقدار نقاط البيانت (Data points) التي نرغب بعرضها, وقد إخترنا إثنان فقط من بيانات مجموعة التدريب (raw_train). وعند تنفيذ هذا الكود تظهر لنا الصورتين التاليتين:



الأسطر من (1لغاية (5): لإنشاء الدالة (format_example) أو أي إسم نختاره لها, وهذه الدالة تستخدم في إجراء بعض المعالجات على بيانات الصور حيث تقوم أولاً بفصل بيانات الصورة عن بيانات التسمية وتجري 

معالجات لبيانات الصورة فقط ثم تقوم بعدها بإعادة دمجهما, وتكون ضرورية للدالة (map) والتي سوف نستخدمها في الفقرة القادمة من الكود.
السطر رقم (2): تحويل بيانات الصورة من نوع (integer) إلى نوع (float).
السطر رقم (3): لتحويل قيم البكسلات للصورة من (255 <-- 0) إلى (1.0 <-- 1.0-).
السطر رقم (4): لتحديد حجم مصفوفات الصور إلى (160 x 160).


السطر رقم (1): إجراء معالجة لبيانات الصور الخاصة بمجموعة التدريب عن طريق الدالة (map) والتي تستخدم بدورها الدالة (format_example) التي قمنا بإنشاءها في الفقرة السابقة.
السطر رقم (2): إجراء معالجة لبيانات الصور الخاصة بمجموعة مراقبة صحة التدريب (Validation).
السطر رقم (3): إجراء معالجة لبيانات الصور الخاصة بمجموعة الإختبار.
السطر رقم (5): لجعل بيانات التدريب تتكرر بشكل غير متسلسل (Shuffle), ومن ثم تقسم على شكل دفعات.
السطر رقم (1): جعل بيانات صحة التدريب على شكل دفعات.
السطر رقم (1): جعل بيانات الإختبار على شكل دفعات.
وللتأكد من أن البيانات قد تحولت إلى دفعات نقوم بكتابة الكود التالي حيث نختار إحدى الدفعات من مجموعة بيانات التدريب لأجل معرفة حجم كل دفعة (Batch_size) وكما يلي:

حيث نرى أن حجم الدفعة هو (32).
نقوم بعدها بإنشاء معمارية النموذج الأصلي (VGG16) وكذلك تحميل الأوزان المدربة الخاصة به وكما يلي:


السطر رقم (1): لإنشاء النموذج المشهور (VGG16) وتحميل الأوزان المدربة الخاصة به وكذلك التخلص من الطبقات التابعة لمرحلة التصنيف (Classification).
السطر رقم (4): لجعل جميع العناصر في طبقاته غير قابلة للتدريب أي مجمدة (Frozen).
السطر رقم (5): لعرض معمارية النموذج مع ملخص لعناصره وطبقاته.
ولمعرفة حجم مصفوفات الخصائص (Feature maps) التي نحصل عليها من هذا النموذج عند تمرير دفعة من بيانات التدريب له وكذلك لكي نعرف عدد هذه المصفوفات نقوم بكتابة الكود التالي:


إنَّ هذه المصفوفات من الخصائص تعتبر بيانات إدخال لمرحلة التصنيف التي سوف نقوم بإنشائها.


السطر رقم (1): إنشاء طبقة من نوع (GlobalAveragePooling2D), حيث تستلم  هذه الطبقة  مصفوفات الخصائص (Feature maps)  وتقوم بتطبيق تقنية  التجميع على هذه المصفوفات إلى إن يصبح حجم كل مصفوفة (1 x 1) وبالتالي تصبح هذه المصفوفات عبارة عن متجه (Vector) عدد عناصره هو عدد هذه المصفوفات (Feature maps).
السطر رقم (2): إختبار الطبقة التي أنشأناها وذلك بإدخال دفعة من الخصائص الخارجة من النموذج الأصلي, وحفظ القيم الخارجة منها لأجل عرضها.
السطر رقم (3): عرض البيانات الخارجة من الطبقة التي أنشأناها حيث نرى أنها دفعة من المتجهات عدد عناصر كل متجه هو (512) عنصر حيث أصبحت كل مصفوفة خصائص عنصر واحد من عناصر كل متجه.


السطر رقم (1): إنشاء طبقة الإخراج (Output layer) لمرحلة التصنيف (Classifier) والتي سوف نقوم بإنشاءها من هذه الطبقة والطبقة التي قمنا بإنشاءها في ألأسطر السابقة. إنَّ هذه الطبقة تتكون من وحدة واحدة (1 unit) وهذا يكفي لأن عدد الأصناف لدينا إثنان فقط.

السطر رقم (2): لمعرفة شكل البيانات التي نحصل عليها عند إدخال دفعة من البيانات التي حصلنا عليها من الطبقة السابقة.
السطر رقم (3): لطباعة شكل البيانات التي حصلنا عليها من السطر السابق.
نلاحظ أن البيانات التي حصلنا عليها من هذه الطبقة هي عبارة عن دفعة من القيم المفردة (Scalar), وهذه الدفعة من القيم تمثل كل واحدة منها الإحتمال المتوقع عند إدخال كل صنف إلى النموذج المرتقب.
نقوم الآن بإنشاء النموذج النهائي الذي سوف يتكون من النموذج (VGG16) الخالي من مرحلة التصنيف, وكذلك من الطبقتين اللاتي قمنا بإنشائهما وكما مبين في الكود التالي:


الأسطر من (1لغاية (5): إنشاء النموذج النهائي الذي يتكون من مرحلتين هما مرحلة إستخلاص الخصائص (Features Extraction) ممثلة بالنموذج (VGG16) ومرحلة التصنيف (Classification) ممثلة بالطبقتين, حيث إستخدمنا الكلاس (Sequential) لإنشاء نواة النموذج ومن ثم إضافة الطبقات إليه.

السطر رقم (1): تهيئة النموذج لعملية التدريب عن طريق الدالة (Compile) وتجهيزه بما يلزم من الأدوات مثل خوارزمية التحسين (Optimizer)  وكذلك دالة حساب قيمة الفقد (Loss).

السطر رقم (4): عرض معمارية النموذج النهائي حيث يظهر بالشكل التالي:


من الصورة أعلاه نلاحظ أنَّ العناصر القابلة للتدريب هي فقط العناصر العائدة إلى الطبقتين اللتين قمنا بإضافتهما إلى النموذج الأصلي لنحصل على النموذج النهائي وهما (512) من الأوزان (Weights) مضافاً لهما قيمة إنحياز واحدة (Bias).

نقوم الآن بإجراء عملية تقييم للنموذج قبل عملية التدريب بإعتبار أنَّ مرحلة إستخلاس الخصائص له قد تم تدريبها سابقاً ولتنفيذ هذا التقييم نكتب الكود التالي:


نلاحظ أنَّ نتيجة التقييم أظهرت أن النموذج قد حصل على درجة (52 %) من الدقة وهذا أمر جيد.

نقوم الآن بكتابة الكود الخاص بعملية التدريب وكما يلي:


وبعد إتمام عملية التدريب نقوم بتقييم النموذج مرةً أخرى وكما يلي:


نلاحظ أننا قد حصلنا على دقة مقدارها (91.4 %) وهذه نتيجة جيدة جداً حيث إننا لم نكرر مجموعة بيانات التدريب سوى عشر مرات.

وبهذا نكون قد إنتهينا من شرح وتوضيح الطريقة الثانية من الطريقتان المستخدمتان لتنفيذ آلية إستخلاص الخصائص (Features Extraction) والتي تعتبر الآلية الأولى لتطبيق تقنية نقل التعلم (Transfer Learning), وسوف نقوم بشرح وتفصيل الآلية الثانية من آليات تطبيق تقنية نقل التعلم في الجزء التالي إنشاء ألله تعالى.




reaction:

تعليقات