المرجو تسجيل الدخول من أجل تحميل الملف المرفق

برمجة شبكة عصبية مع كيراس KERAS للتعرف على الأرقام المكتوبة بخط اليد MNIST

المؤلف: عمر الصنهاجي الغازي *
*مهندس في المعلوميات و الرياضيات التطبيقية، مدير مشاريع و مهتم بميدان الذكاء الاصطناعي و سلاسل الكتل
صفحة لنكد إن

آخر تحديث: Oct. 1, 2022, 5:49 p.m.

تحديد النموذج وتدريب الشبكة العصبية (و تسمى أيضا الشبكة العصبونية) ثم اختبار التنبؤات


الحمد لله و الصلاة و السلام على سيدنا رسول الله و آله و صحبه و من والاه

في هذا الدرس، سوف نقوم بعرض:
- تقديم لمكتبة كيراس (KERAS)
- متطلبات ثبيت هذه المكتبة
- وظائف كيراس المثبتة لتنفيذ و تدريب الشبكات العصبونية
- عرض تمرين تطبيقي من أجل برمجة شبكة عصبية متخصصة في التعرف على الأرقام المكتوبة باليد
- هيكل الشبكة العصبونية التي سنقوم بتنفيذها
- برمجة و اختبار الشبكة على جوبيتر لاب (Jupyter Lab)


عرض تقديمي لمكتبة كيراس:
كيراس هي مكتبة مبرمجة بلغة بيثون (Python) تم تطويرها لإنشاء و تدريب الشبكات العصبية بكل بساطة
كيراس هي واجهة مبنية على المكتبة الأصلية "طينسور فلوو" (Tensor Flow) التي طورتها غوغل ، وتعمل كواجهة لوظائف طينسور فلوو
تقدم كيراس وظائف جاهزة من أجل:
تصميم شبكة العصبية
تدريب شبكة عصبية باستخدام مجموعة تدريب ، وتقليل دالة الخسارة
استخدام الشبكة العصبية المدربة للقيام بتنبؤات
وظائف كيراس الجاهزة من أجل إنشاء و تدريس الشبكات العصبية
تهيئة الشبكة العصبية
model = sequential
إضافة طبقة بها عدد من الخلايا العصبية ، مع وظيفة التنشيط = "relu" (وظيفة التنشيط الأخرى الممكنة: Softmax ، relu ، leaky relu ، ...)
model.add(Dense(num_input, activation='relu’))
تدريب الشبكة العصبية باستخدام بيانات X_train (ونتائج Y_train) ، واختبرها باستخدام بيانات X_test (ونتائج Y_test)
model.fit(X_train, Y_train ,validation_data=X_test, Y_test, epochs, verbose)
القيام بتنبؤات
model.predict_classes(X_test)

الهدف من هذا التمرين هو إنشاء شبكة عصبية وتدريبها على التعرف على أرقام مكتوبة يدويًا (أرقام مجموعة بيانات "منيست" 28 بكسل × 28 بكسل)


مجموعة بيانات "منيست" هي عبارة عن مجموعة مكونة من 60 ألف صورة (كل صورة طولها و عرضها كلاهما يساوي 28 بكسل) لأرقام مكتوبة يدوية، تم تحضيرها سلفا من طرف مجموعة من المتطوعين من مكتب الإحصاء الأمريكي و بعض طلبة الجامعات، و تستخدم في أبحاث التعرف على الصور و في تدريب شبكات الذكاء الاصطناعي عموما

هيكل الشبكة العصبية
سنقوم بإنشاء شبكة عصبية بثلاث طبقات:
طبقة دخول تحتوي على 784 خلية عصبية (28 × 28): ستتلقى كل خلية عصبية بكسل واحدًا من الصورة الرقمية المكتوبة بخط اليد)
الطبقة الثانية تحتوي على 100 خلية عصبية
طبقة خروج تحتوي على 10 خلايا عصبية ، كل خلية عصبية تتوافق مع فئة (فئة واحدة للرقم "0" ، فئة واحدة للرقم "1" ، ... .. ، فئة واحدة للرقم "9")


الخلية العصبية تسمى أيضا بال"العصبون" (Neuron)

يمكنكم تحميل مصدر البرنامج للتمرين بلغة بايثون على الرابط أدناه
مصدر بايثون (.py ملف)


المتطلبات الأساسية للتثبيت
الإعداد: المتطلبات المسبقة: تثبيت Python 3.9 و Pip command
Pip install tensorflow
Pip install Keras
Pip install matplotlib
Pip install jupyterlab

بعد الانتهاء من تثبيت هذه المكتبات، نبدأ التمرين على بركة الله
أول عملية بقوم بها هي إطلاق أمر Jupyter Lab على نافدة نظام التشغيل


بعد ذلك، سوف تنفتح تلقائيا بوابة جديدة على المتصفح، يمكنك من خلالها أن تكتب و تنفذ تعليمات بيثون :


أول شيء سوف نقوم به هو استيراد مكتبة كيراس، و استيراد الوظائف التي سوف نحتاجها


بعد ذلك سنقوم باستيراد مجموعة صور "منيست" و تفريقها على مصفوفتين، مصفوفة تدريب (بيانات التدريب X_Train و نتائج التدريب Y_Train)، و مصفوفة اختبار (بيانات الاختبار X_Test و نتائج الاختبار Y_Test)
بيانات و نتائج التدريب سوف تستخدمها الشبكة العصبية لكي تتدرب على التعرف على الأرقام المكتوبة يدويا
بينما بيانات و نتائج الاختبار سوف نستخدمها لاختبار نجاح تدريب الشبكة العصبية في التدريب، و دقتها في التعرف على الأرقام


لنقم الآن بعرض أبعاد كل مصفوفة


نلاحظ أن مصفوفة بيانات التدريب X_traint تحتوي على 60 ألف صورة، و كل صورة منها أبعادها 28 على 28 بكسل
و مصفوفة نتائج التدريب y_train تحتوى على 60 ألف نتيجة (نتيجة لكل صورة رقم من بيانات التدريب)
و مصفوفة بيانات الاختبار X_test تحتوي على 10 آلاف صورة، و كل صورة منها أبعادها 28 على 28 بكسل
و مصفوفة نتائج الاختبار y_test تحتوي على 10 آلاف نتيجة (نتيجة لكل صورة رقم من بيانات الاختبار)

فلنقم الآن بعرض أول صورة من مصفوفة بيانات التدريب


إذن الصورة هي صورة للرقم 5 مكتوب يدويا
لنقم الآن بعرض نتيجة التدريب المرافقة لهذه الصورة الأولى


إذن نتيجة تدريب البيان الأول في مصفوفة التدريب هي موافقة للصورة التي يحويها هذا البيان
لنقم الآن بعرض الصورة الثانية من مصفوفة بيانات التدريب


ثم عرض نتيجة التدريب الموافقة لهذه الصورة الثانية


نفس الشيء إذن نتيجة تدريب البيان الثاني في مصفوفة التدريب هي موافقة للصورة التي يحويها هذا البيان (صورة الرقم 0)

مجموعة مصفوفة بيانات التدريب و نتائج التدريب هي إذن مجموعة معدة مسبقة تحتوي على صور لأرقام مكتوبة يدويا مرفقة بنتائجها، و الغرض منها مساعدة الشبكات العصبية على التعلم من أجل التعرف على صور هذه الأرقام
و نفس الشيء بالنسبة لمصفوفة بيانات الاختبار و نتائج الاختبار، فهي أيضا مجموعة معدة مسبقة تحتوي على صور لأرقام مكتوبة يدويا مرفقة بنتائجها، و الغرض منها اختبار نجاعة الشبكة العصبية بعد الانتهاء من تدريبها

ملحوظة: تدريب و اختبار الشبكات العصبية ينبني دائما على مبدأ تقسيم مجموعة البيانات إلى بيانات للتدريب من جهة (و التي سوف تحتوي على العدد الأكبر من البيانات، هنا: 60 ألف صورة)، و بيانات للاختبار من جهة أخرى (و التي سوف تحتوي على عدد أقل من البيانات، هنا: 10 آلاف صورة).
الآن، سوف نقوم بتسطيح صور الأرقام، و تحويلها إلى متجهات ذات بعد واحد (عوض صور ثنائية الأبعاد)، و ذلك لكي نقوم بعد ذلك بربط كل بكسل من الصورة بعصبون واحد في مدخل الشبكة العصبية.
و بذلك سوف تتحول مصفوفة بيانات التدريب إلى الأبعاد (60,000x784) عوض (60,000x20x28)
و تتحول مصفوفة بيانات الاختبار إلى الأبعاد (10,000x784)عوض (10,000x28x28)



فلنقم الآن بعرض قيم المتجهة ، نلاحظ أن قيمة كل بكسل منها تتراوح بين 0 و 255


سوف نقوم الآن بمنظمة هذه القيم لكي نحولها للمجال 0-1، و ذلك لتفادي إشباع الشبكة العصبية التي سنقوم بتدريبها


y_train وy_test تمثل مباشرة القيم العددية لنتائج الاختبار (القيم العددية 0، 1، 2، ....)
الآن سنقوم بتحويلها إلى متجهات متفرقة
بمعنى أن القيمة 0 سنقوم بتحويلها إلى المتجهة [0،0،0،0،0،0،0،0،0،0]
و القيمة 1 سنحولها إلى المتجهة [0،1،0،0،0،0،0،0،0،0]
و القيمة 7 سنحولها إلى المتجهة [0،0،0،0،0،0،0،1،0،0]
و هكذا دواليك


الهدف من القيام بهذه التحويلات هو تحويلها إلى بعد مماثل لعدد عصبونات مخرج الشبكة العصبية (عدد عصبونات الخروج هو 10 عصبونات)

سنقوم الآن ببناء نموذج الشبكة العصبية، المكون من طبقة دخول تحتوي على 784 عصبونا (يساوي عدد بكسلات كل صورة)، و طبقة وسطى مكونة من 100 عصبونا (تسمى الطبقة الخفية) و طبقة خروج تحتوي على 10 عصبونات (كل عصبون يمثل تصنيفا لرقم من الأرقام من 1 إلى 9)


نلاحظ أننا استخدمنا دالة تفعيل Relu في طبقة الدخول و في الطبقة الوسطى، و دالة تفعيل Softmax في طبقة الخروج
سوف نتطرق إلى معنى دالة التفعيل و إلى دورها و الفروق المجودة بينها في مقال آخر إن شاء الله، أما الآن فسوف نستعملها بهذه الطريقة دون الدخول في تفاصيل إضافية
نفس الشيء بالنسبة لاستخدام مُحسِّن Adam و دالة احتساب الأخطاء categorical_crossentropy

سوف نقوم الآن بتزويد الشبكة العصبية ببيانات التدريب و الاختبار، و بتنفيذ التدريب عبر 5 دورات تدريبية (epochs = 5)


يأخذ تنفيذ التدريب بضعة دقائق، و نلاحظ أن دقة النموذج (accuracy) تتحسن بعد كل دورة تدريبية
لنقم الآن بتقييم الشبكة العصبية التي قمنا بتدريبها


نلاحظ أن دقة الشبكة العصبية في التعرف على الأرقام يفوق 97% (التقييم تم عبر بيانات الاختبار)

أخيرا، لنقم الآن ببعض الاختبارات


عرض الصورة الأولى من مجموعة الاختبار

و الآن سوف نختبر هل الشبكة العصبية تمكنت من التعرف على صورة الرقم بشكل صحيح

إذن الشبكة العصبية تمكنت بنجاح من التعرف على صورة الرقم 7
لنقم الآن بإعادة نفس الاختبارات على صورتين أخريين


إذن، شبكتنا العصبية المدربة قامت أيضا بالتعرف بنجاح على هذين الرقمين
الآن نموذجنا تم تدريبه بشكل جيد، و هو جاهز للتصدير و الاستعمال في تطبيقات و برمجيات أخرى

وصلنا إلى نهاية هذا الدرس ،نتمنى أن يكون هذا المقال قد ساعدكم في فهم و إجراء أول اختبار لبرمجة شبكة عصبية قادرة على التعرف على صور بسيطة للأرقام، و على أمل لقياكم في مقال آخر إن شاء الله

الرجوع إلى الصفحة الرئيسية