 |
تناولنا في الجزء الثاني موضوع الشبكات العصبية الإصطناعية (sANN) بقليلٍ من التفصيل حيث تناولنا نوع خاص من الشبكات التي تحتوي على طبقة واحدة بخلية واحدة (نيورون مفرد) والتي تسمى بيرسبترون, حيث درسنا خوارزمية التعلم أو (أو التدريب) الخاصة بها, كذلك تناولنا بشئٍ من التفصيل الشبكات العصبية التي تحتوي عدة طبقات, ثمَّ درسنا خوارزمية التعلم الخاصة بها. |
التعلم العميق وأستخداماته في الرؤية الحاسوبية - الجزء الثالث
Deep Learning For Computer Vision-Part 3
بسم إلله الرحمن الرحيم
تناولنا في الجزء الثاني موضوع الشبكات العصبية الإصطناعية (sANN) بقليلٍ من التفصيل حيث تناولنا نوع خاص من الشبكات التي تحتوي على طبقة واحدة بخلية واحدة (نيورون مفرد) والتي تسمى بيرسبترون, حيث درسنا خوارزمية التعلم أو (أو التدريب) الخاصة بها, كذلك تناولنا بشئٍ من التفصيل الشبكات العصبية التي تحتوي عدة طبقات, ثمَّ درسنا خوارزمية التعلم الخاصة بها.
في هذا الجزء سوف نقوم بتنفيذ بعض التطبيقات العملية لما درسناه, حيث نقوم بإنشاء تطبيقات خاصة بالشبكات العصبية الإصطناعية, حيث نبدأ ببعض التطبيقات البسيطة ثم نتدرج بتطبيقات أكثر تعقيداً ونرى النتائج التي سوف نحصل عليها.
في هذا التطبيق نقوم بإنشاء شبكة عصبية إصطناعية بسيطة تتكون من طبقة واحدة فيها خلية واحدة وهناك مدخلان للبيانات (x1, x2), وهذه الشبكة مهمتها تطبيق عملية (Logical AND gate) على المداخيل وإخراج النتيجة (Y). حيث قمنا بكتابة الكود بإستخدام لغة بايثون فقط (بدون أي مكتبة إضافية) وذلك لأجل سهولة الشرح والتوضيح.وإستخدمنا نفس خطوات خوارزمية التدريب الخاصة بالبيرسبترون التي تناولناها في الجزء الثاني.
الشكل (1) يبين الكود بلغة بايثون وبإستخدام برنامج (PyCharm) كبيئة عمل:
شكل رقم (1).
شرح الكود:
الأسطر من (1) لغاية (3): لعمل ثلاث مصفوفات تمثل بيانات التدريب (inputs x1, x2) وكذلك بيانات الإخراج(outputs Ydesired). السطران الرابع والخامس يمثلان الإعلان عن متغيرين هما (theta) لحفظ قيمة العتبة و (alfa) لحفظ معدل التعلم (learning rate). السطر السادس للإعلان عن مصفوفة تضم قيم الوزنين الخاصين بالمدخلين, وهنا أعطيناهما قيم إبتدائية (0.3) للوزن الخاص بالمدخل (x1) و (- 0.1) للوزن الخاص بالمدخل (x2).
السطر رقم (7): هو للإعلان عن مصفوفة فارغة لأجل أن نجمع فيها القيم الخارجة من الشبكة (Yactual) حيث تظهر لنا كنتيجة بعد طباعتها.
السطر رقم (8): للإعلان عن عداد (i). السطر التاسع للإعلان عن المتغير (epoch) والذي يمثل رقم الحقبة (الحقبة الواحدة تمثل الإنتهاء من جميع البيانات الخاصة بالتدريب).
السطر رقم (10): قمنا بعمل حلقة تتكرر (20) مرة (من صفر إلى 19) وهذا العدد يمثل عدد خطوات التدريب (iteration). في السطر الحادي عشر قمنا بوضع شرط وهو عندما تصل قيمة (i = 4) أي إنتهاء حقبة كاملة, فإذا تحقق هذا الشرط سوف تجرى عدة عمليات وهي:
1 - تصفير العداد (i).
2 - طباعة رقم الحقبة.
3 - إضافة عدد واحد إلى عداد الحقب.
4 - طباعة مصفوفة المخرجات (y_actual_array).
5 - تصفير مصفوفة المخرجات لكي تستعد لتجميع المخرجات في الحقبة اللاحقة.
السطر رقم (18): قمنا بإحتساب قيمة (x_sum) والذي يمثل مجموع قيم المداخيل المضروبة بأوزانها ومطروحاً منها قيمة العتبة (theta). أما الأسطر من (19) إلى (22) فهي لتطبيق دالة التنشيط (step function) على المقدار (x_sum) لإستخراج قيمة (Yactual). أما السطر (23) فهو للإيعاز بإستخراج قيمة الخطأ (l1_error) لإستخدامها بعملية تحديث الأوزان. أما السطران (24) و (25) فهما لأجل إحتساب قيمة التحديث للوزنين (weights[0] & weights[1]) . وفي السطران (26) و (27) لأجل القيام بعملية التحديث.
وأخيراً قمنا بطباعة النتائج الخاصة بالحقبة الأخيرة .
الشكل رقم (2) يمثل النتائج بعد التدريب.
نلاحظ إن النتائج في الحقب الثلاثة الأولى غير مطابقة مع القيم الحقيقية الموجودة في بيانات التدريب (Ydesired) ولكن إعتباراً من الحقبة الرابعة تطابقت النتائج وهذا يدل على إكتمال عملية التدريب.
التطبيق الثاني :
في هذا التطبيق نقوم بإنشاء شبكة عصبية ذات ثلاث طبقات, الطبقة الأولى (input layer) وظيفتها أن تقوم بتوزيع الإشارات الداخلة إلى الشبكة (x1, x2) إلى النيورونات الموجودة في الشبكة المخفية (hidden layer) والتي تحتوي على نيورونات عدد (2), وتوجد طبقة إخراج تحتوي على نيورون واحد, وكما مبينة في الشكل رقم (3) أدناه.
مهمة هذه الشبكة أن تقوم بعد عملية التدريب بتنفيذ إجراء (Exclusive-OR operation) على المداخيل وإعطاءنا إشارات إخراج مطابقة تقريباً لما تقوم به دائرة ال (Exclusive-OR) المنطقية (logical).
الشكل رقم (4) يبين لنا الكود لهذا التطبيق والذي كتبناه بلغة البايثون.
شرح الكود:
السطر رقم (1): إستدعينا مكتبة (math) .
الأسطر من (2) لغاية (10): فهي للإعلان عن المتغيرات المطلوبة ماعدا السطر (7) فهو قيمة ثابتة.
السطر رقم (11): للإيعاز بإنشاء حلقة تتكرر (60000) مرة, كل تكرار يمثل خطوة تدريب واحدة (iteration), وكل (4) خطوات من التدريب تمثل حقبة واحدة (epoch). عندما تصل قيمة العداد (i) إلى العدد (4) فهذا يعني حقبة واحدة, وهذا ماتكتشفه الجملة الشرطية (if I >= 4:) في السطر رقم (12).
بقية الأسطر ضمن الحلقة التكرارية هي لأجل إجراء الحسابات المطلوبة لأجل تحديث الأوزان وكذلك تحديث قيم العتبات (ɵ3, ɵ4, ɵ5) وحسب خطوات العمل في الخوارزمية الخاصة بتدريب الشبكة العصبية ذات الطبقات المتعددة والتي درسناها في المقالة السابقة.
السطر رقم (48): إيعاز لأجل تخزين قيمة الإخراج (y5) في المصفوفة (y_actual_array).بعد إنتهاء حلقة التكرار نقوم بطباعة رقم الحقبة (epoch) النهائي وكذلك نطبع قيم الإخراج في هذه الحقبة والذي يكون مخزوناً في المصفوفة (y_actual_array).
وبعد تنفيذ الكود نحصل على النتيجة التالية كما في الشكل (5) أدناه.
شكل رقم (5).
نلاحظ أنَّ القيم التي حصلنا عليها هي قريبة جداًّ من القيم التي نحصل عليها في حالة إستخدامنا بوابة (Exclusive-OR) حقيقية حيث يفترض أن نحصل على قيم هي :0 1 1 0 .
إستنتاجات مهمة:
في كلا التطبيقان كانت القيم الخارجة من الشبكة هي أما صفر (أو قيمة قريبة جداًّ منها) أو واحد (أو قيمة قريبة جداًّ منها), أي أنَّ هناك صنفان من النتائج (Two classes), لذلك من الممكن إعتبار هكذا شبكات بأنها تقوم بعملية التصنيف (Classification). وبما أنَّ البيانات الداخلة الى الشبكة الأولى يمكن فصلها بواسطة خط مستقيم (hyper plane) لذلك فإنَّ إستخدام شبكة ذات طبقة واحدة (single layer) ممكن أن تقوم بهذه المهمة, أما في حالة الشبكة الثانية, فإنَّ البيانات الداخلة إليها أكثر تعقيداً حيث لايمكن فصلها بخطٍّ مستقيم حيث إنها تكون متداخلة بعض الشيء, وهذا ماجعلنا نستخدم شبكة ذات ثلاث طبقات في التطبيق الثاني.
وبهذا نكون قد إنتهينا من عمل وتنفيذ تطبيقان بسيطان جداّ وسوف نقوم بالعمل على تطبيقات أكثر تعقيداً وبإستخدام مكتبات مشهورة مثل مكتبة TensorFlow ومكتبة (Keras) وذلك في المقال اللاحق إن شاء ألله.
خاتمة:
قمنا في هذه المقالة بكتابة كود بلغة بايثون لتكوين شبكة عصبية إصطناعية بسيطة جداًّ تتكون من طبقة واحدة توجد فيها خلية واحدة ذات مدخلان, تقوم هذه الشبكة بمهمة بوابة (AND gate), وقمنا بشرح الكود لأجل إستيعاب الموضوع, وكذلك قمنا بتنفيذ التطبيق على بيئة (pyCharm) ولاحظنا النتائج الخارجة من الشبكة وقارناها مع النتائج القياسية (كما في مجموعة بيانات التدريب), فكانت متطابقة تماماً.
بعدها قمنا بكتابة كود لأجل إنشاء شبكة عصبية متعددة الطبقات بسيطة جداًّ وقمنا بتنفيذ الكود ولاحظنا النتائج الخارجة فكانت متقاربة جداًّ من النتائج المطلوبة.
حسن فنجان عداي


تعليقات
إرسال تعليق