تقنية نقل التعلم
(Transfer learning)
الجزء الثالث
المهندس
حسن فنجان عداي
بسم إلله الرحمن الرحيم
لقد تطرقنا في الجزئين الأول والثاني إلى الآلية الأولى لتنفيذ تقنية نقل التعلم المسماة (Transfer Learning) والتي تسمى آلية إستخلاص الخصائص أو المزايا (Features Extraction) وذكرنا بأنه توجد هناك طريقتين لتنفيذ تلك الآلية وقد ذكرناهما بالتفصيل, أما الآن فسوف نقوم إنشاء ألله تعالى في هذا الجزء بشرح وتوضيح الآلية الثانية لتنفيذ تقنية نقل التعلم (Transfer Learning) وهذه الآلية تسمى الضبط الدقيق (Fine Tuning).
الضبط الدقيق
Fine Tuning
هناك آلية أخرى لتنفيذ تقنية نقل التعلم (Transfer learning) بإستخدام مشاهير النماذج المدربة, وهذه الطريقة تسمى طريقة الضبط الدقيق (Fine tuning) وهي طريقة تعتبرمكملة للطريقة السابقة (Features Extraction) حيث إنها تعتمد على الطريقة السابقة في تدريب مرحلة التصنيف (Classification) الخاصة بنا.
تتلخص هذه الطريقة بأن نجعل بعض الطبقات الأخيرة للنموذج الأصلي قابلة للتدريب (Trainable) حيث نقوم بتدريبها هي ومرحلة التصنيف (Classification) الخاصة بنا والتي قمنا بتدريبها آنفاً والتي سنضيفها إلى النموذج الأصلي.
تسمى هذه الطريقة بعملية الضبط الدقيق لأننا نقوم فيها بعملية تدريب جزئي لبعض طبقات النموذج الأصلي ونموذجنا الذي أضفناه لجعلهما أكثر ملائمة للمهمة التي نطمح أن يقوم بها نموذجنا.
نلجأ إلى uإستخدام هذه الطريقة في الحالات التي تكون فيها مجموعة الصور التي نريد إنشاء نموذج يقوم بتصنيفها تختلف كثيراً عن تلك الصور التي تم تدريب النموذج الأصلي عليها.
وهنا قد يطرح السؤال التالي, وهو لماذا لانقوم بإجراء عملية الضبط الدقيق (Fine tuning) على جميع طبقات النموذج الأصلي؟ الجواب على ذلك هو الآتي:
1 – إنَّ الطبقات الأولى لأي نموذج يستخدم الطبقات الإلتفافية (Convolutional layers) تكون مدربة على الخصائص العامة, وهذه الخصائص تشترك بها جميع الصور وبالتالي فلا حاجة لإعادة تدريب هذه الطبقات, بينما تكون الطبقات الأعلى مدربة على الخصائص أو المزايا الأكثر خصوصية, وبالتالي تحتاج إلى إعادة ضبط دقيق لكي يتسنى لنا إستخدامها في مهمتنا.
2 – إنَّ الطبقات الأولى إذا شملها هذا التدريب الجزئي سيكون تأثرها كبيراً وسوف نخسر كثيراً من فوائدها.
3 – كلما إزداد عدد المعاملات القابلة للتدريب بإستخدام مجموعة بيانات صغيرة كما هي حالتنا سوف تحدث مشكلة (Overfitting), حيث إنَّ مجموع المعاملات في هذا النموذج مايقارب (15) مليون.
لهذه الأسباب فإنَّ الطريقة المثلى هي الإكتفاء بتدريب طبقتين أو ثلاث من الطبقات الأخيرة أو العليا من النموذج.
الرسم التالي يوضح طريقة تنفيذ عملية الضبط الدقيق (Fine Tuning):
من شروط نجاح هذه العملية أن تكون مرحلة التصنيف الخاصة بنا قد تم تدريبها بالفعل بإستخدام إحدى الطريقتين السابقتين, فلو بدأنا بتنفيذ هذه الطريقة بدون تدريب مسبق لمرحلة التصنيف فإنً قيم الفقد (Loss) في بداية عملية التدريب تكون عالية جداً مما يتسبب بتخريب كل الأوزان المدربة في النموذج الأصلي مما يؤدي إلى الفشل الكامل.
لذلك يجب أن تكون الخطوات لهذه الطريقة كما يلي:
1 – نضيف طبقتنا الغير مدربة إلى النموذج الأصلي المدرب بعد إزالة مرحلة التصنيف (Classification) منه.
2 – نقوم بتجميد النموذج الأصلي أي جعل عناصره غير قابلة للتدريب.
3 – نقوم بتدريب الجزء الخاص بنا كما أي مرحلة المصنف (Classifier) مر بنا في الطرق السابقة.
4 – نقوم بإلغاء تجميد بعض الطبقات في النموذج الأصلي لجعلها قابله للتدريب.
5 – نقوم بالتدريب الجزئي لكامل النموذج النهائي المتكون من النموذج الأصلي مضافاً له نموذجنا الذي قمنا بإنشائه والذي هو المصنف (Classifier).
ولتوضيح الموضوع بشكل عملي نقوم بالإستفادة من النموذج الذي أنشأناه ودربناه في الفقرة السابقة أي إننا سوف نقوم بإكمال مابدأناه وسوف نبدأ بإلغاء التجميد عن بعض طبقات النموذج الأصلي والذي يشكل المرحلة ألأولى من النموذج النهائي (أي مرحلة إستخلاص الخصائص), نقوم بإلغاء التجميد عن جميع طبقات النموذج الأصلي ثم بعدها نبقي على الطبقات الثلاث الأخيرة من هذا النموذج ونجمد ماتبقى من طبقات, وكما مبين في الكود التالي:
نلاحظ من الصورة التالية بأنَّ جميع طبقات النموذج (VGG16) قد أصبحت قابلة للتدريب :
لمعرفة عدد الطبقات التي يحويها النموذج (VGG16) والخالي من مرحلة التصنيف (Classification) نقوم بكتابة الكود التالي ونرى النتيجة:
حيث نلاحظ إنه يحتوي على (19) طبقة.
سوف نقوم بجعل الطبقات الثلاثة الأخيرة قابلة للتدريب وماسواها نجعلها مجمدة.
والطبقات الثلاثة هي (block5-conv1) و (block5-conv2) و (block5-conv3) أما الطبقة الأخيرة فهي من نوع (MaxPooling2D) حيث إنها لاتوجد فيها عناصر قابلة للتدريب.
ولأجل القيام بهذا العمل نكتب الكود التالي:
السطر رقم (1): لتحديد بداية الطبقات المشمولة برفع التجميد, وقد إخترنا الرقم (16) بإعتبار إنَّ آخر أربع طبقات من النموذج (VGG16) تبدأ من الرقم (16).
السطر رقم (2): إنشاء حلقة تتكرر بعدد الطبقات المشمولة بالتجميد, وهذه الطبقات تبدأ من الطبقة الأولى وتنتهي عند الطبقة (15) حيث إنَّ الرقم الأخير لايحسب في حلقات التكرار.
السطر رقم (3): لتجميد الطبقات الواحدة تلو الأخرى.
نلاحظ الآن معمارية النموذج الأصلي (VGG16) بعد إلغاء تجميد الطبقات الثلاثة:
من خلال الصورة أعلاه نلاحظ بأنَّ عدد العناصر القابلة للتدريب قد أصبحت (4,719,616) وهذه العناصر بالإضافة لعناصر الطبقات التي تشكل مرحلة التصنيف سوف نقوم بتدريبها.
نعود الآن إلى النموذج الشامل والذي يتكون من النموذج (VGG16) ومرحلة التصنيف (Classification) التي قمنا بإضافتها وقمنا بتدريبها في الفقرة السابقة, حيث نقوم بتهيئته للتدريب مرة أخرى بعد التغييرات الأخيرة التي أجريناها عليه وكما يلي:
حيث نقوم بتجهيزه بمايلزم من أدوات ضرورية لعملية التدريب كما مر في المراحل السابقة.
ونلاحظ هنا أننا قمنا بتقليل معدل التعلم (Learning rate) إلى عشر القيمة التي إستخدمناها في الفقرة السابقة وذلك لأن معدل التعلم العالي سوف يتسبب بصعود قيمة الفقد (Loss ) إلى قيمة عالية تتسبب بفقدان التعلم في عناصر الطبقات الثلاثة أو مايسمى بالنسيان بأن تنسى هذه العناصر ماتعلمته سابقاً وبالتالي تؤدي إلى فشل العملية (Fine Tuning).
وللتأكد من العمل الذي قمنا به ولمعرفة عدد الطبقات القابلة للتدريب في النموذج النهائي (model) نقوم بكتابة الكود التالي:
حيث نلاحظ بأنَّ عدد الطبقات القابلة للتدريب هي (6) طبقات وهي الطبقات الأربعة من النموذج (VGG16) حيث إنَّ الطبقة الرابعة كما قلنا سابقاً لاتحتوي أساساً على عناصر قابلة للتدريب والطبقتين الأخرتين هما الطبقتين الخاصتين بمرحلة التصنيف (Classification).
نقوم الآن بكتابة الكود الخاص بالتدريب وكما يلي:
السطر رقم (1): تحديد عدد مرات تكرار مجموعة البيانات في عملية التدريب هذه الخاصة بالضبط الدقيق.
السطر رقم (2): حساب عدد مرات تكرار مجموعة البيانات في عملية التدريب السابقة مضافاً إليها عدد مرات تكرار البيانات في عملية التدريب التي سوف نقوم بإجرائها.
السطر رقم (4): لبدأ عملية التدريب عن طريق الدالة (fit) وقد مررنا إليها العدد الكلي للحقب (total_epochs)
ولكن يبدأ من الحقبة رقم (11) لأننا مررنا إليه الحقب التي يتجاوزها وهي آخر حقبة من التدريب السابق.
إننا نستطيع وبكل بساطة أن نمرر عدد الحقب (epochs = 10) ولكن لأجل عملية المقارنه من ناحية الدقة قبل وبعد إجراء عملية الضبط الدقيق وملاحظة الفرق والتي سوف نجريها لاحقاً.
وبعد إنتهاء عملية التدريب نقوم بإجراء عملية تقييم للنموذج وكما يلي:
ونلاحظ أننا قد حصلنا على دقة مقدارها (97.3 %).
نقوم الآن بإستخلاص بعض البيانات الإحصائية لغرض عرضها والإستفادة منها في إجراء مقارنه بين دقة النموذج (Accuracy) وقيمة الفقد (Loos) قبل وبعد إجراء عملية الضبط الدقيق.
السطر رقم (1): إستخلاص القيم الخاصة بدقة النموذج في حالة التدريب التي حصلنا عليها من عملية التدريب الأخيرة وإضافتها إلى تلك التي حصلنا عليها من التدريب السابق.
السطر رقم (2): إستخلاص القيم الخاصة بدقة النموذج في حالة التقييم إثناء التدريب التي حصلنا عليها من عملية التدريب الأخيرة وإضافتها إلى تلك التي حصلنا عليها من التدريب السابق.
السطر رقم (4): إستخلاص القيم الخاصة بقيمة الفقد (Loss) في حالة التدريب وإضافتها إلى السابقة.
السطر رقم (5): إستخلاص القيم الخاصة بقيمة الفقد (Loss) في حالة التقييم وإضافتها إلى السابقة.
ولغرض إظهار هذه النتائج كرسم بياني نقوم بكتابة الكود التالي وبإستخدام مكتبة (matplotlib).
قيت لدينا مرحلة أخيرة وهي عملية إختبار النموذج من خلال عملية التوقع (Prediction) حيث نقوم بإدخال مجموعة من الصور التي نختارها من مصادر متعددة أو نقوم نحن بتصويرها, حيث نقوم بإدخال هذه الصور إلى النموذج والحصول منه على نتيجة التوقع بعدها نقوم بإظهار الصور ونتيجة التوقع لكل صورة ومعرفة ما إذا كانت مطابقة للواقع أم لا مع ملاحظة إننا يفضل أن نختار صور يكون كل من إرتفاعها (Height) وعرضها (Width) متقاربة قدر الإمكان لكي لاتحدث تشوهات في قياسات الصور عند جعل إرتفاعها وعرضها متساويان أي (160×160), كذلك يجب وضع مجموعة الصور في مجلد (Folder) يوضع ضمن المجلد الخاص بالتطبيق وقد سميناه (data), كذلك يجب ترقيم الصور كما يلي:
(0.jpg, 1.jpg, 2.jpg) وهكذا.
ويجب كتابة الكود التالي:
وبذلك نكون قد إنتهينا من هذه المقالة بأجزائها الثلاثة والتي قمنا من خلالها بشرح وتوضيح تقنية نقل التعلم (Transfer Learning) من حيث المفهوم وكذلك من حيث آليات التطبيق. نأمل أن يكون ماقدمناه واضحاً وأن تعم الفائدة للجميع, ومن ألله تعالى نستمد العون والتوفيق.
تعليقات
إرسال تعليق