جدول المحتويات[يخفي][يعرض]
يمكن مقارنة الدماغ بالشبكات العصبية. هذا هو القياس الذي يستخدم عادة لمساعدة شخص جديد في الموضوع لفهم الأفكار الكامنة وراء التعلم الآلي والشبكات العصبية الاصطناعية.
نظرًا لوجود عدة طبقات من الحسابات الرياضية والإحصائية التي تجري خلف الكواليس ، فإن تعريف هذه الشبكات كوظيفة رياضية هو طريقة أكثر تقدمًا.
هذا مخصص للأشخاص المهتمين حقًا بالتعلم الآلي ويريدون معرفة كيفية كتابة كود شبكة بايثون العصبية.
في هذه المقالة ، سنشرح كيفية إنشاء شبكة عصبية عميقة متصلة بالكامل (DNN) من البداية بايثون 3.
نظرة عامة على بنية الملف الخاصة بكود شبكة Python العصبية الخاصة بنا
سيكون هناك ثلاثة ملفات تم إنشاؤها هنا. الأول هو ملف nn.py البسيط ، والذي سيتم مناقشته في "Setting Up Helper Functions" و "Building the Neural Network from Scratch."
سيكون لدينا أيضًا ملف باسم mnist loader.py لتحميل بيانات الاختبار ، كما هو موضح في "تحميل بيانات MNIST".
أخيرًا ، سيكون لدينا ملف باسم test.py سيتم تشغيله في المحطة لاختبار شبكتنا العصبية.
تم وصف هذا الملف بالتفصيل في "تشغيل الاختبارات".
التنزيل
يجب تنزيل مكتبة NumPy Python لمتابعة هذا البرنامج التعليمي. يمكنك تحقيق ذلك باستخدام الأمر التالي على الجهاز:
استيراد الوحدات وإعداد وظيفة المساعد
المكتبتان الوحيدتان اللتان نحتاجهما هما العشوائية و NumPy ، والتي سنستوردها على الفور. بالنسبة للأوزان الأولية لشبكتنا العصبية ، سنقوم بتبديلها باستخدام المكتبة العشوائية.
من أجل تسريع عملياتنا الحسابية ، سنستخدم NumPy أو np (وفقًا للاتفاقية ، غالبًا ما يتم استيرادها كـ np). سيتم إجراء وظيفتين مساعدتين بعد استيرادنا. دالتان سيني: واحد و سيني رئيس أولي.
سيعمل الانحدار اللوجستي على تصنيف البيانات باستخدام الدالة السينية ، بينما سيحسب backpropagation دلتا أو التدرج اللوني باستخدام الدالة الأولية السينية.
إنشاء فئة الشبكة
إن بناء شبكة عصبية مرتبطة بالكامل هو المحور الوحيد لهذا القسم. ستشمل فئة الشبكة جميع الوظائف التي تليها. سيتم إنشاء الوظيفة Object () {[native code]} في البداية في فئة شبكتنا.
وسيطة واحدة ، الأحجام ، مطلوبة بواسطة الوظيفة Object () {[الكود الأصلي]}. متغير الأحجام عبارة عن مجموعة من القيم الرقمية التي تمثل عدد عقد الإدخال الموجودة في كل طبقة من شبكتنا العصبية.
نقوم بتهيئة أربع خصائص في طريقة __init__ الخاصة بنا. تُستخدم متغيرات الإدخال ، والأحجام ، لتعيين قائمة أحجام الطبقة وعدد الطبقات ، وعدد الطبقات ، على التوالي.
تتمثل الخطوة الأولى في تعيين التحيزات الأولية لشبكتنا بشكل عشوائي لكل طبقة تتبع طبقة الإدخال.
أخيرًا ، كل رابط بين طبقات الإدخال والمخرجات له أوزانه التي يتم إنشاؤها عشوائيًا. يعطي Np.Random.Randn () عينة عشوائية مأخوذة من التوزيع الطبيعي للسياق.
وظيفة التغذية إلى الأمام
في الشبكة العصبية ، يتم إرسال المعلومات إلى الأمام بواسطة وظيفة التغذية الأمامية. وسيطة واحدة ، أ ، تشير إلى متجه التنشيط الحالي ، ستكون مطلوبة بواسطة هذه الوظيفة.
تقدر هذه الوظيفة عمليات التنشيط في كل طبقة عن طريق التكرار عبر جميع التحيزات والأوزان في الشبكة. الجواب المعطى هو التنبؤ ، وهو تنشيط الطبقة الأخيرة.
نزول متدرج دفعة صغيرة
العمود الفقري لفصل شبكتنا هو الانحدار. في هذا الإصدار ، نستخدم نزولًا متدرجًا صغيرًا (عشوائيًا) ، وهو تباين معدل في نزول التدرج.
يشير هذا إلى أنه سيتم استخدام مجموعة صغيرة من نقاط البيانات لتحديث نموذجنا. يتم تمرير أربع وسيطة مطلوبة وواحدة اختيارية إلى هذه الطريقة. المتغيرات الأربعة المطلوبة هي مجموعة بيانات التدريب ، وعدد العهود ، وحجم الدُفعات الصغيرة ، ومعدل التعلم (eta).
تتوفر بيانات الاختبار عند الطلب. سنقوم بتوفير بيانات الاختبار عندما نقوم في النهاية بتقييم هذه الشبكة. يتم تعيين عدد العينات في هذه الوظيفة في البداية على طول القائمة بمجرد تحويل بيانات التدريب إلى نوع قائمة.
نحن أيضًا نطبق نفس العملية لاختبار البيانات المقدمة. وذلك لأنه بدلاً من إعادتها إلينا كقوائم ، فهي في الحقيقة عبارة عن ملفات مضغوطة من القوائم. عندما نقوم بتحميل عينات بيانات MNIST لاحقًا ، سنتعلم المزيد حول هذا الموضوع.
إذا تمكنا من التأكد من أننا نقدم كلا نوعي البيانات كقوائم ، فإن هذا النوع من الصب ليس ضروريًا بالضرورة.
بمجرد حصولنا على البيانات ، ننتقل إلى فترات التدريب في حلقة. فترة التدريب ليست سوى جولة واحدة من تدريب الشبكة العصبية. نقوم أولاً بتبديل البيانات في كل فترة لضمان العشوائية قبل عمل قائمة بالدُفعات الصغيرة.
سيتم استدعاء وظيفة الدُفعة المصغرة للتحديث ، والتي تمت مناقشتها أدناه ، لكل دفعة صغيرة. سيتم أيضًا إرجاع دقة الاختبار إذا كانت بيانات الاختبار متاحة.
دالة مساعدة مشتقة التكلفة
دعنا نطور وظيفة مساعدة تسمى مشتق التكلفة أولاً قبل أن ننشئ بالفعل كود backpropagation. إذا ارتكبنا خطأ في طبقة المخرجات الخاصة بنا ، فإن دالة مشتق التكلفة ستظهر ذلك.
يتطلب مدخلين: مصفوفة تنشيط الإخراج وإحداثيات y لقيم الإخراج المتوقعة.
وظيفة التكاثر العكسي
يجب وضع متجه التنشيط الحالي ، والتنشيط ، بالإضافة إلى أي ناقلات تنشيط أخرى ، وعمليات التنشيط ، والمتجهات z ، z ، في الاعتبار جميعًا. يتم تنشيط طبقة تسمى طبقة الإدخال أولاً.
سنقوم بحلقة من خلال كل تحيز ووزن بعد طرحها. تتضمن كل حلقة حساب متجه z كمنتج نقطي للأوزان والتفعيل ، وإضافته إلى قائمة z ، وإعادة حساب التنشيط ، وإضافة التنشيط المحدث إلى قائمة التنشيطات.
أخيرًا ، الرياضيات. يتم حساب دلتا ، التي تساوي الخطأ من الطبقة السابقة مضروبًا في العدد الأولي السيني للعنصر الأخير من متجهات zs ، قبل أن نبدأ التمرير للخلف.
تم تعيين الطبقة الأخيرة من nabla b لتكون دلتا ، والطبقة الأخيرة من nabla w تم تعيينها لتكون حاصل الضرب النقطي للدلتا والطبقة الثانية إلى الأخيرة من التنشيطات (تم نقلها حتى نتمكن بالفعل من إجراء الحساب) .
نواصل كما كان من قبل ، نبدأ بالطبقة الثانية وننتهي بالطبقة الأخيرة ، ونكرر العملية بعد الانتهاء من هذه الطبقات الأخيرة. ثم يتم إعادة nablas في شكل tuple.
تحديث نزول التدرج المصغر
تتضمن طريقة SGD (النسب المتدرجة العشوائية) الخاصة بنا من قبل تحديث الدُفعات الصغيرة. نظرًا لأنه يتم استخدامه في SGD ولكنه يتطلب أيضًا backprop ، فقد ناقشت مكان وضع هذه الوظيفة.
أخيرًا ، اخترت نشره هنا. يبدأ بتوليد 0 متجهات من nablas التحيزات والأوزان ، تمامًا كما فعلت وظيفة backprop الخاصة بنا.
يتطلب الدفعة المصغرة ومعدل التعلم eta كمدخلين له. في الدفعة الصغيرة ، نستخدم بعد ذلك وظيفة backprop للحصول على دلتا كل مصفوفة nabla لكل إدخال ، x ، ومخرج ، y. ثم يتم تحديث قوائم النبلة بهذه الدلتا.
أخيرًا ، نستخدم معدل التعلم و nablas لتحديث أوزان وتحيزات الشبكة. يتم تحديث كل قيمة إلى أحدث قيمة ، مطروحًا منها معدل التعلم ، مضروبًا في حجم المينيباتش ، ثم تضاف إلى قيمة النبلة.
تقييم الوظيفة
دالة التقييم هي الأخيرة التي نحتاج إلى كتابتها. بيانات الاختبار هي المدخل الوحيد لهذه الوظيفة. في هذه الوظيفة ، نقوم فقط بمقارنة مخرجات الشبكة بالنتيجة المتوقعة ، y. من خلال تغذية المدخلات ، x ، إلى الأمام ، يتم تحديد مخرجات الشبكة.
كود كامل
عندما نجمع كل الشفرات ، هكذا تظهر.
اختبار الشبكة العصبية
تحميل بيانات MNIST
• بيانات MNIST بصيغة .pkl.gz ، والتي سنفتحها باستخدام GZIP وتحميلها بالمخلل. دعنا نكتب طريقة سريعة لتحميل هذه البيانات كمجموعة من الحجم ثلاثة ، مقسمة إلى بيانات التدريب والتحقق من الصحة والاختبار.
لتسهيل إدارة بياناتنا ، سنكتب وظيفة أخرى لترميز y في مصفوفة من 10 عناصر. ستكون المصفوفة كلها 0s باستثناء 1 الذي يطابق الرقم الصحيح للصورة.
سنستخدم بيانات التحميل الأساسية وطريقة واحدة للتشفير الساخن لتحميل بياناتنا بتنسيق قابل للقراءة. ستتم كتابة وظيفة أخرى من شأنها تحويل قيم x الخاصة بنا إلى قائمة بحجم 784 ، تتطابق مع 784 بكسل للصورة ، وقيمنا y في شكل متجه واحد مشفر ساخن.
ثم سنجمع قيمتي x و y بحيث يتطابق أحدهما مع الآخر. ينطبق هذا على مجموعات بيانات التدريب والتحقق من الصحة والاختبار. ثم نعيد البيانات المتغيرة.
إجراء الاختبارات
سننشئ ملفًا جديدًا يسمى "محمل mnist" يستورد كل من الشبكة العصبية التي أنشأناها سابقًا (nn البسيط) ومحمل مجموعة البيانات MNIST قبل أن نبدأ الاختبار.
في هذا الملف ، كل ما نحتاج إلى القيام به هو استيراد البيانات ، وبناء شبكة بحجم طبقة إدخال 784 وحجم طبقة إخراج 10 ، وتشغيل وظيفة SGD للشبكة على بيانات التدريب ، ثم اختبارها باستخدام بيانات الاختبار.
ضع في اعتبارك أنه بالنسبة لقائمة طبقات الإدخال الخاصة بنا ، لا يوجد فرق بين أي من الأرقام بين 784 و 10. يمكننا تغيير الطبقات الأخرى بالطريقة التي نحبها ؛ فقط أحجام المدخلات والمخرجات ثابتة.
ثلاث طبقات ليست ضرورية ؛ قد نستخدم أربعة أو خمسة أو حتى اثنين فقط. استمتع بتجربتها.
وفي الختام
هنا ، باستخدام Python 3 ، نقوم بإنشاء شبكة عصبية من البداية. إلى جانب الرياضيات عالية المستوى ، ناقشنا أيضًا تفاصيل التنفيذ.
بدأنا بتنفيذ وظائف المساعد. لكي تعمل الخلايا العصبية ، تعتبر الوظائف الأولية السينية والسينية حاسمة. ثم نطبق وظيفة التغذية الأمامية ، وهي العملية الأساسية لتغذية البيانات في الشبكة العصبية.
بعد ذلك ، أنشأنا وظيفة الانحدار في Python ، المحرك الذي يقود شبكتنا العصبية. من أجل تحديد "الحدود الدنيا المحلية" وتحسين أوزانها وتحيزاتها ، تستخدم شبكتنا العصبية النسب المتدرج. أنشأنا وظيفة backpropagation باستخدام نزول متدرج.
من خلال تقديم التحديثات عندما لا تتطابق المخرجات مع التسميات المناسبة ، تتيح هذه الوظيفة للشبكة العصبية "التعلم".
أخيرًا ، وضعنا بايثون الجديد تمامًا الشبكة العصبية للاختبار باستخدام مجموعة بيانات MNIST. كل شيء يعمل بسلاسة.
ترميز سعيد!
اترك تعليق