بدون شهادة دكتوراه من خلال TensorFlow وKeras والتعلّم المتعمق

1. نظرة عامة

تم تعديل هذا البرنامج التعليمي ليتوافق مع الإصدار 2.2 من TensorFlow.

74f6fbd758bf19e6.png

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية إنشاء شبكة عصبية وتدريبها للتعرّف على الأرقام المكتوبة بخط اليد. أثناء تحسين شبكتك العصبية لتحقيق دقة بنسبة% 99، ستتعرّف أيضًا على الأدوات التي يستخدمها خبراء التعلّم العميق لتدريب نماذجهم بكفاءة.

يستخدم برنامج التدريب العملي هذا مجموعة بيانات MNIST، وهي مجموعة من 60,000 رقم مصنّف شغلت أجيالاً من حاملي شهادات الدكتوراه لمدة عقدَين تقريبًا. ستحلّ المشكلة باستخدام أقل من 100 سطر من رموز Python / TensorFlow البرمجية.

أهداف الدورة التعليمية

  • ما هي الشبكة العصبية وكيفية تدريبها؟
  • كيفية إنشاء شبكة عصبية أساسية بطبقة واحدة باستخدام tf.keras
  • كيفية إضافة المزيد من الطبقات
  • كيفية إعداد جدول معدّل التعلّم
  • كيفية إنشاء شبكات عصبونية التفافية
  • كيفية استخدام تقنيات التسوية: الإسقاط، والتسوية الدفعية
  • ما هو فرط التخصيص؟

المتطلبات

متصفّح فقط يمكن إجراء ورشة العمل هذه بالكامل باستخدام Google Colaboratory.

الملاحظات

يُرجى إعلامنا إذا لاحظت أي خطأ في هذا المختبر أو إذا كنت تعتقد أنّه يجب تحسينه. نتعامل مع الملاحظات من خلال المشاكل التي يتم الإبلاغ عنها في GitHub [ رابط الملاحظات].

2. البدء السريع في Google Colaboratory

تستخدِم هذه الميزة الاختبارية Google Colaboratory ولا تتطلّب أي إعداد من جانبك. يمكنك تشغيلها من جهاز Chromebook. يُرجى فتح الملف أدناه وتنفيذ الخلايا للتعرّف على أوراق ملاحظات Colab.

c3df49e90e5a654f.png Welcome to Colab.ipynb

في ما يلي تعليمات إضافية:

اختيار واجهة خلفية لوحدة معالجة الرسومات

hsy7H7O5qJNvKcRnHRiZoyh0IznlzmrO60wR1B6pqtfdc8Ie7gLsXC0f670zsPzGsNy3QAJuZefYv9CwTHmjiMyywG2pTpnMCE6Slkf3K1BeVmfpsYVw6omItm1ZneqdE31F8re-dA

في قائمة Colab، اختَر بيئة التشغيل > تغيير نوع بيئة التشغيل، ثمّ اختَر "وحدة معالجة الرسومات". سيتم الاتصال بوقت التشغيل تلقائيًا عند التنفيذ الأول، أو يمكنك استخدام الزر "ربط" في أعلى يسار الصفحة.

تنفيذ دفتر الملاحظات

evlBKSO15ImjocdEcsIo8unzEe6oDGYnKFe8CoHS_7QiP3sDbrs2jB6lbyitEtE7Gt_1UsCdU5dJA-_2IgBWh9ofYf4yVDE740PwJ6kiQwuXNOLkgktzzf0E_k5VN5mq29ZXI5wb7Q

نفِّذ الخلايا واحدة تلو الأخرى من خلال النقر على إحدى الخلايا واستخدام Shift-ENTER. يمكنك أيضًا تشغيل ورقة الملاحظات بأكملها من خلال بيئة التشغيل > تشغيل الكل

جدول المحتويات

OXeYYbtKdLCNnw_xovSMeMwSdD7CL_w25EfhnpRhhhO44bYp3zZpU72J5tKaSuo8wpas0GK5B2sTBlIMiFmdGxFRQ9NmwJ7JIRYy5XtpWKQCPdxQVRPy_0J_LshGIKjtw8P9fXozaA

تحتوي جميع دفاتر الملاحظات على جدول محتويات. يمكنك فتحها باستخدام السهم الأسود على اليمين.

الخلايا المخفية

GXTbXUO8xpPFKiGc6Q-cFwFHxHvOa105hHg3vk77EDpStyhU4AQMN3FYenbiBusHXUSk-yGXbRDcK-Cwx18XbDtyqB5WRr3_2jhnLvFxW8a7H_4cGvVDKrEMto_QxhfTeO0hwmrfng

لن تعرض بعض الخلايا سوى عنوانها. هذه ميزة خاصة بأوراق ملاحظات Colab. يمكنك النقر مرّتين على هذه الملفات للاطّلاع على الرمز البرمجي بداخلها، ولكنّه عادةً لا يكون مثيرًا للاهتمام. عادةً ما تكون وظائف دعم أو تصور. ومع ذلك، يجب تشغيل هذه الخلايا لتعريف الدوال بداخلها.

3- تدريب شبكة عصبونية

سنشاهد أولاً تدريب شبكة عصبية. يُرجى فتح دفتر الملاحظات أدناه وتنفيذ جميع الخلايا. لا تركّز على الرمز البرمجي الآن، سنبدأ في شرحه لاحقًا.

c3df49e90e5a654f.png keras_01_mnist.ipynb

أثناء تنفيذ دفتر الملاحظات، ركِّز على الرسومات البيانية. يمكنك الاطّلاع على التفسيرات أدناه.

بيانات التدريب

لدينا مجموعة بيانات من الأرقام المكتوبة بخط اليد والتي تم تصنيفها حتى نعرف ما تمثله كل صورة، أي رقم بين 0 و9. في دفتر الملاحظات، سيظهر لك مقتطف:

ad83f98e56054737.png

ستصنّف الشبكة العصبية التي سننشئها الأرقام المكتوبة بخط اليد في فئاتها العشر (من 0 إلى 9). ويتم ذلك استنادًا إلى مَعلمات داخلية يجب أن تكون لها قيمة صحيحة لكي يعمل التصنيف بشكلٍ جيد. يتم تعلُّم هذه "القيمة الصحيحة" من خلال عملية تدريب تتطلّب "مجموعة بيانات مصنَّفة" تحتوي على صور والإجابات الصحيحة المرتبطة بها.

كيف يمكننا معرفة ما إذا كانت الشبكة العصبونية المدرَّبة تعمل بشكل جيد أم لا؟ إنّ استخدام مجموعة بيانات التدريب لاختبار الشبكة هو بمثابة غش. لقد رأى مجموعة البيانات هذه عدة مرات أثناء التدريب، ومن المؤكد أنّه سيحقق أداءً جيدًا جدًا عليها. نحتاج إلى مجموعة بيانات مصنّفة أخرى لم يتم استخدامها أثناء التدريب لتقييم أداء الشبكة في "العالم الحقيقي". ويُطلق عليها اسم "مجموعة بيانات التحقّق من الصحة".

التدريب

مع تقدّم التدريب، يتم تعديل مَعلمات النموذج الداخلية بمعدّل مجموعة واحدة من بيانات التدريب في كل مرة، ويصبح النموذج أفضل وأفضل في التعرّف على الأرقام المكتوبة بخط اليد. يمكنك الاطّلاع عليه في الرسم البياني الخاص بالتدريب:

3f7b405649301ea.png

على اليسار، "الدقة" هي ببساطة النسبة المئوية للأرقام التي تم التعرّف عليها بشكل صحيح. ويزداد مع تقدّم التدريب، وهذا أمر جيد.

على اليمين، يمكننا رؤية "الخسارة". لإجراء التدريب، سنحدّد دالة "الخسارة" التي تمثّل مدى سوء تعرّف النظام على الأرقام، وسنحاول تقليلها. ما تراه هنا هو أنّ الخسارة تنخفض في كلّ من بيانات التدريب وبيانات التحقّق من الصحة مع تقدّم التدريب، وهذا أمر جيد. وهذا يعني أنّ الشبكة العصبونية تتعلّم.

يمثّل المحور السيني عدد "الحقب" أو التكرارات خلال مجموعة البيانات بأكملها.

التوقّعات

بعد تدريب النموذج، يمكننا استخدامه للتعرّف على الأرقام المكتوبة بخط اليد. يوضّح التمثيل البصري التالي مدى جودة الأداء على بعض الأرقام المعروضة من الخطوط المحلية (السطر الأول)، ثم على 10,000 رقم من مجموعة بيانات التحقّق. يظهر الصف المتوقّع أسفل كل رقم، ويكون باللون الأحمر إذا كان غير صحيح.

c0699216ba0effdb.png

كما ترون، هذا النموذج الأوّلي ليس جيدًا جدًا، لكنّه لا يزال يتعرّف على بعض الأرقام بشكل صحيح. تبلغ دقة التحقّق النهائي حوالي% 90، وهي نسبة جيدة بالنسبة إلى النموذج البسيط الذي نبدأ به، ولكن هذا يعني أيضًا أنّه لا ينجح في التحقّق من 1, 000 رقم من أصل 10,000 رقم. هذا العدد أكبر بكثير من العدد الذي يمكن عرضه، ولهذا السبب يبدو أنّ جميع الإجابات خاطئة (باللون الأحمر).

Tensors

يتم تخزين البيانات في مصفوفات. تتلاءم صورة بتدرّج الرمادي بحجم 28×28 بكسل مع مصفوفة ثنائية الأبعاد بحجم 28×28. ولكن بالنسبة إلى صورة ملونة، نحتاج إلى المزيد من الأبعاد. هناك 3 قيم ألوان لكل بكسل (أحمر وأخضر وأزرق)، لذا سيلزم جدول ثلاثي الأبعاد بالأبعاد [28 و28 و3]. ولتخزين مجموعة من 128 صورة ملونة، يجب استخدام جدول رباعي الأبعاد بالأبعاد [128, 28, 28, 3].

تُسمّى هذه الجداول المتعدّدة الأبعاد "موترات"، وتُسمّى قائمة أبعادها "شكل".

4. [معلومات]: أساسيات الشبكات العصبونية

باختصار

إذا كنت تعرف جميع المصطلحات بالخط العريض في الفقرة التالية، يمكنك الانتقال إلى التمرين التالي. إذا كنت مبتدئًا في مجال التعلّم العميق، أهلاً بك، ويُرجى مواصلة القراءة.

witch.png

بالنسبة إلى النماذج التي تم إنشاؤها كتسلسل من الطبقات، يوفّر Keras واجهة برمجة التطبيقات Sequential API. على سبيل المثال، يمكن كتابة مصنّف صور يستخدم ثلاث طبقات كثيفة في Keras على النحو التالي:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[28, 28, 1]),
    tf.keras.layers.Dense(200, activation="relu"),
    tf.keras.layers.Dense(60, activation="relu"),
    tf.keras.layers.Dense(10, activation='softmax') # classifying into 10 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

طبقة كثيفة واحدة

الأرقام المكتوبة بخط اليد في مجموعة بيانات MNIST هي صور بتدرّج الرمادي بحجم 28x28 بكسل. أبسط طريقة لتصنيفها هي استخدام 784 بكسل (28×28) كمدخلات لشبكة عصبية ذات طبقة واحدة.

Screen Shot 2016-07-26 at 12.32.24.png

تجري كل "عصبونة" في الشبكة العصبية عملية جمع مرجّح لكل مدخلاتها، ثم تضيف ثابتًا يُعرف باسم "الانحياز"، وبعد ذلك تُدخل النتيجة في "دالة التنشيط" غير الخطية. "الأوزان" و"الانحيازات" هما مَعلمتان سيتم تحديدهما من خلال التدريب. يتمّ تهيئتها بقيم عشوائية في البداية.

تمثّل الصورة أعلاه شبكة عصبية ذات طبقة واحدة تضم 10 خلايا عصبية للناتج لأنّنا نريد تصنيف الأرقام إلى 10 فئات (من 0 إلى 9).

باستخدام عملية ضرب المصفوفات

في ما يلي كيفية تمثيل طبقة شبكة عصبونية تعالج مجموعة من الصور من خلال عملية ضرب المصفوفات:

matmul.gif

باستخدام العمود الأول من الأوزان في مصفوفة الأوزان W، نحسب المجموع المرجّح لجميع وحدات البكسل في الصورة الأولى. يتجاوب هذا المجموع مع العصبون الأول. باستخدام العمود الثاني من الأوزان، نكرّر العملية نفسها مع العصبون الثاني وهكذا حتى العصبون العاشر. يمكننا بعد ذلك تكرار العملية للصور الـ 99 المتبقية. إذا أطلقنا على المصفوفة التي تحتوي على 100 صورة اسم X، فإنّ جميع المجموعات المرجّحة للخلايا العصبية العشر، والتي يتم احتسابها على 100 صورة، هي ببساطة X.W، أي عملية ضرب مصفوفات.

يجب أن تضيف كل خلية عصبية الآن الانحياز (قيمة ثابتة). بما أنّ لدينا 10 خلايا عصبية، لدينا 10 ثوابت انحياز. سنسمّي هذا المتّجه المكوّن من 10 قيم b. يجب إضافته إلى كل سطر من المصفوفة التي تم احتسابها سابقًا. باستخدام بعض السحر الذي يُعرف باسم "البث"، سنكتب ذلك باستخدام علامة الجمع البسيطة.

وأخيرًا، نطبّق دالة تنشيط، مثل "softmax" (الموضّحة أدناه) ونحصل على الصيغة التي تصف شبكة عصبية ذات طبقة واحدة، يتم تطبيقها على 100 صورة:

Screen Shot 2016-07-26 at 16.02.36.png

في Keras

باستخدام مكتبات الشبكات العصبية العالية المستوى، مثل Keras، لن نحتاج إلى تنفيذ هذه الصيغة. ومع ذلك، من المهم أن نفهم أنّ طبقة الشبكة العصبية هي مجرد مجموعة من عمليات الضرب والجمع. في Keras، تتم كتابة طبقة كثيفة على النحو التالي:

tf.keras.layers.Dense(10, activation='softmax')

التعمّق في التفاصيل

من السهل ربط طبقات الشبكة العصبونية. تحسب الطبقة الأولى المجموعات المرجّحة لوحدات البكسل. تحسب الطبقات اللاحقة المجموعات المرجّحة لنتائج الطبقات السابقة.

fba0638cc213a29.png

والفرق الوحيد، بصرف النظر عن عدد الخلايا العصبية، سيكون في اختيار دالة التنشيط.

دوال التنشيط: relu وsoftmax وsigmoid

عادةً ما تستخدم دالة التنشيط "relu" لجميع الطبقات باستثناء الطبقة الأخيرة. ستستخدِم الطبقة الأخيرة في المصنّف التنشيط "softmax".

644f4213a4ee70e5.png

مرة أخرى، يحسب "العصبون" مجموعًا مرجّحًا لجميع مدخلاته، ويضيف قيمة تُسمى "الانحياز"، ثم يمرّر النتيجة من خلال دالة التنشيط.

تُعرف دالة التنشيط الأكثر شيوعًا باسم "RELU"، وهي اختصار لعبارة وحدة خطية مصحَّحة. إنّها دالة بسيطة للغاية كما يمكنك أن ترى في الرسم البياني أعلاه.

كانت دالة التنشيط التقليدية في الشبكات العصبية هي "الدالة السينية"، ولكن تبيّن أنّ "دالة relu" تتضمّن خصائص تقارب أفضل في كل مكان تقريبًا، وهي الآن الخيار المفضّل.

41fc82288c4aff5d.png

تفعيل Softmax للتصنيف

تحتوي الطبقة الأخيرة من شبكتنا العصبية على 10 عُقد عصبية لأنّنا نريد تصنيف الأرقام المكتوبة بخط اليد إلى 10 فئات (من 0 إلى 9). يجب أن تعرض 10 أرقام بين 0 و1 تمثّل احتمال أن يكون هذا الرقم 0 أو 1 أو 2 وما إلى ذلك. لذلك، سنستخدم في الطبقة الأخيرة دالّة التفعيل تُعرف باسم "softmax".

يتم تطبيق دالة softmax على متّجه من خلال أخذ الأسّ لكل عنصر ثم تسوية المتّجه، عادةً عن طريق قسمته على معيار "L1" (أي مجموع القيم المطلقة) بحيث يصل مجموع القيم المسوّاة إلى 1 ويمكن تفسيرها على أنّها احتمالات.

يُطلق على ناتج الطبقة الأخيرة، قبل التفعيل، أحيانًا اسم "اللوغاريتمات". إذا كان هذا المتّجه L = [L0, L1, L2, L3, L4, L5, L6, L7, L8, L9]، يكون:

ef0d98c0952c262d.png d51252f75894479e.gif

فقدان الإنتروبيا المتقاطعة

بعد أن أصبحت شبكتنا العصبية تنتج توقّعات من الصور المُدخَلة، علينا قياس مدى صحة هذه التوقّعات، أي المسافة بين ما تخبرنا به الشبكة والإجابات الصحيحة، والتي تُعرف غالبًا باسم "التصنيفات". تذكَّر أنّ لدينا تصنيفات صحيحة لكل الصور في مجموعة البيانات.

يمكن استخدام أي مسافة، ولكن بالنسبة إلى مشاكل التصنيف، تكون "مسافة الإنتروبيا المتقاطعة" هي الأكثر فعالية. سنسمّي هذا الخطأ أو دالة "الخسارة" على النحو التالي:

6dbba1bce3cadc36.png

النزول المتدرّج

"تدريب" الشبكة العصبونية يعني في الواقع استخدام صور التدريب والتصنيفات لتعديل الأوزان والانحيازات من أجل تقليل دالة فقدان الإنتروبيا المتقاطعة. إليك طريقة عملها.

الإنتروبيا المتقاطعة هي دالة للأوزان والانحيازات ووحدات البكسل في صورة التدريب وفئتها المعروفة.

إذا حسبنا المشتقات الجزئية للإنتروبيا المتقاطعة بالنسبة إلى جميع الأوزان وجميع الانحيازات، نحصل على "تدرّج" يتم حسابه لصورة وتصنيف وقيمة حالية للأوزان والانحيازات. تذكَّر أنّه يمكن أن يكون لدينا ملايين الأوزان والانحيازات، لذا يبدو أنّ حساب التدرّج يتطلّب الكثير من العمل. لحسن الحظ، تتولّى TensorFlow هذه العملية نيابةً عنا. الخاصية الرياضية للتدرّج هي أنّه يشير إلى "الأعلى". بما أنّنا نريد الانتقال إلى المكان الذي تكون فيه الإنتروبيا المتداخلة منخفضة، فإنّنا نتّجه في الاتجاه المعاكس. نعدّل معاملات الترجيح والانحياز بجزء من التدرّج. بعد ذلك، نكرّر العملية نفسها مرارًا وتكرارًا باستخدام الدفعات التالية من الصور والتصنيفات التدريبية، وذلك في حلقة تدريبية. نأمل أن يؤدي ذلك إلى تقليل الإنتروبيا المتقاطعة إلى الحدّ الأدنى، مع العلم أنّه لا يوجد ما يضمن أنّ هذا الحدّ الأدنى فريد.

gradient descent2.png

التقسيم إلى دفعات صغيرة والزخم

يمكنك احتساب التدرّج على صورة مثال واحدة فقط وتعديل الأوزان والانحيازات على الفور، ولكنّ إجراء ذلك على مجموعة من 128 صورة مثلاً يعطي تدرّجًا يمثّل القيود التي تفرضها صور الأمثلة المختلفة بشكل أفضل، وبالتالي من المرجّح أن يتقارب مع الحلّ بشكل أسرع. حجم الدفعة الصغيرة هو مَعلمة قابلة للتعديل.

تتميّز هذه التقنية، التي تُعرف أحيانًا باسم "النزول التدرّجي العشوائي"، بميزة عملية أخرى، وهي أنّ استخدام مجموعات من البيانات يعني أيضًا استخدام مصفوفات أكبر، ويسهل عادةً تحسينها على وحدات معالجة الرسومات ووحدات معالجة الموتّرات.

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

cc544924671fa208.png

صورة توضيحية: نقطة سرج يكون التدرّج اللوني 0، ولكنّه ليس الحدّ الأدنى في جميع الاتجاهات. (معلومات تحديد مصدر الصورة Wikimedia: By Nicoguaro - Own work, CC BY 3.0)

الحلّ هو إضافة بعض الزخم إلى خوارزمية التحسين حتى تتمكّن من تجاوز نقاط السرج بدون توقّف.

مسرد المصطلحات

الدُفعات أو الدُفعات الصغيرة: يتم التدريب دائمًا على دُفعات من بيانات التدريب والتصنيفات. يساعد ذلك الخوارزمية في التوافق. عادةً ما تكون سمة "الحزمة" هي السمة الأولى لموترات البيانات. على سبيل المثال، يحتوي متّجه متعدّد الأبعاد بالشكل [100, 192, 192, 3] على 100 صورة بحجم 192x192 بكسل مع ثلاث قيم لكل بكسل (النموذج اللوني أحمر أخضر أزرق).

فقدان الإنتروبيا المتقاطعة: دالة فقدان خاصة تُستخدم غالبًا في أدوات التصنيف.

الطبقة الكثيفة: هي طبقة من الخلايا العصبية حيث تكون كل خلية عصبية مرتبطة بجميع الخلايا العصبية في الطبقة السابقة.

الميزات: يُطلق على مدخلات الشبكة العصبية أحيانًا اسم "الميزات". يُطلق على فن تحديد أجزاء مجموعة البيانات (أو مجموعات الأجزاء) التي يجب إدخالها إلى شبكة عصبونية للحصول على توقّعات جيدة اسم "هندسة الخصائص".

التصنيفات: اسم آخر "للفئات" أو الإجابات الصحيحة في مشكلة التصنيف الخاضع للإشراف

معدّل التعلّم: جزء من التدرّج يتم من خلاله تعديل الأوزان والانحيازات في كل تكرار من حلقة التدريب.

اللوغاريتمات: تُسمّى نواتج إحدى طبقات الخلايا العصبية قبل تطبيق دالة التنشيط "اللوغاريتمات". يأتي المصطلح من "الدالة اللوجستية" المعروفة أيضًا باسم "الدالة السينية" التي كانت دالة التنشيط الأكثر شيوعًا. تم اختصار "مخرجات الخلايا العصبية قبل الدالة اللوجستية" إلى "اللوغاريتمات".

دالة الخسارة: دالة الخطأ التي تقارن نواتج الشبكة العصبية بالإجابات الصحيحة

الخلية العصبية: تحسب المجموع المرجّح لمدخلاتها، وتضيف تحيّزًا، وتمرّر النتيجة من خلال دالة تنشيط.

الترميز الأحادي: يتم ترميز الفئة 3 من أصل 5 كمتجه من 5 عناصر، وكلها أصفار باستثناء العنصر الثالث الذي تكون قيمته 1.

relu: وحدة خطية مصحَّحة دالّة تفعيل شائعة للعصبونات.

sigmoid: هي دالّة تفعيل أخرى كانت شائعة الاستخدام وما زالت مفيدة في حالات خاصة.

softmax: هي دالّة تفعيل خاصة تعمل على متّجه، وتزيد الفرق بين أكبر عنصر وجميع العناصر الأخرى، كما تعمل على تسوية المتّجه ليكون مجموع عناصره 1، وبالتالي يمكن تفسيره على أنّه متّجه احتمالات. يُستخدَم كخطوة أخيرة في المصنّفات.

الموتر: "الموتر" هو بنية بيانات تشبه المصفوفة ولكن بعدد عشوائي من الأبعاد. المتّجه متعدّد الأبعاد أحادي الأبعاد هو متجه. الموتر الثنائي الأبعاد هو مصفوفة. ويمكنك بعد ذلك الحصول على موترات ذات 3 أو 4 أو 5 أبعاد أو أكثر.

5- لننتقل إلى التعليمات البرمجية

لنرجع إلى دفتر الملاحظات الخاص بالدراسة، ولنقرأ التعليمات البرمجية هذه المرة.

c3df49e90e5a654f.png keras_01_mnist.ipynb

لنستعرض كل الخلايا في ورقة الملاحظات هذه.

الخلية "المَعلمات"

يتم هنا تحديد حجم الدفعة وعدد مرات التدريب وموقع ملفات البيانات. تتم استضافة ملفات البيانات في حزمة Google Cloud Storage (GCS)، ولهذا السبب يبدأ عنوانها بـ gs://

الخلية "عمليات الاستيراد"

يتم استيراد جميع مكتبات Python الضرورية هنا، بما في ذلك TensorFlow وmatplotlib للرسومات البيانية.

الخلية "أدوات العرض المرئي [RUN ME]****"

تحتوي هذه الخلية على رمز مرئي غير مهم. يتم تصغيره تلقائيًا، ولكن يمكنك فتحه وإلقاء نظرة على الرمز البرمجي عندما يتوفر لديك الوقت من خلال النقر عليه مرّتين.

الخلية "tf.data.Dataset: تحليل الملفات وإعداد مجموعات بيانات التدريب والتحقّق"

استخدمت هذه الخلية واجهة برمجة التطبيقات tf.data.Dataset لتحميل مجموعة بيانات MNIST من ملفات البيانات. ليس من الضروري قضاء الكثير من الوقت في هذه الخلية. إذا كنت مهتمًا بواجهة برمجة التطبيقات tf.data.Dataset، إليك برنامجًا تعليميًا يشرحها: خطوط نقل البيانات السريعة في وحدات معالجة Tensor. في الوقت الحالي، الأساسيات هي:

يتم تخزين الصور والتصنيفات (الإجابات الصحيحة) من مجموعة بيانات MNIST في سجلات ذات طول ثابت في 4 ملفات. يمكن تحميل الملفات باستخدام دالة السجلّ الثابت المخصّصة:

imagedataset = tf.data.FixedLengthRecordDataset(image_filename, 28*28, header_bytes=16)

لدينا الآن مجموعة بيانات من وحدات بايت للصور. ويجب فك ترميزها إلى صور. نحدّد دالة لإجراء ذلك، ولا يتم ضغط الصورة، لذا لا تحتاج الدالة إلى فك ترميز أي شيء (decode_raw لا تفعل شيئًا أساسيًا). يتم بعد ذلك تحويل الصورة إلى قيم نقطة عائمة بين 0 و1. يمكننا إعادة تشكيلها هنا كصورة ثنائية الأبعاد، ولكن في الواقع نحتفظ بها كمجموعة مسطحة من وحدات البكسل بحجم 28*28 لأنّ هذا ما تتوقعه الطبقة الكثيفة الأولية.

def read_image(tf_bytestring):
    image = tf.io.decode_raw(tf_bytestring, tf.uint8)
    image = tf.cast(image, tf.float32)/256.0
    image = tf.reshape(image, [28*28])
    return image

نطبّق هذه الدالة على مجموعة البيانات باستخدام .map ونحصل على مجموعة بيانات من الصور:

imagedataset = imagedataset.map(read_image, num_parallel_calls=16)

نستخدم النوع نفسه من القراءة وفك الترميز للتصنيفات، ون.zip الصور والتصنيفات معًا:

dataset = tf.data.Dataset.zip((imagedataset, labelsdataset))

لدينا الآن مجموعة بيانات من أزواج (صورة، تصنيف). هذا ما يتوقّعه نموذجنا. لسنا مستعدين تمامًا لاستخدامه في وظيفة التدريب بعد:

dataset = dataset.cache()
dataset = dataset.shuffle(5000, reshuffle_each_iteration=True)
dataset = dataset.repeat()
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

تحتوي واجهة برمجة التطبيقات tf.data.Dataset على جميع دوال الأداة المساعدة اللازمة لإعداد مجموعات البيانات:

يخزّن .cache مجموعة البيانات مؤقتًا في ذاكرة الوصول العشوائي (RAM). هذه مجموعة بيانات صغيرة جدًا، لذا ستنجح العملية. .shuffle ترتّبها بشكل عشوائي مع مخزن مؤقت يتضمّن 5,000 عنصر. من المهم ترتيب بيانات التدريب بشكل عشوائي. تكرّر .repeat مجموعة البيانات. وسنتدرّب عليها عدة مرات (عدة دورات تدريبية). تجمع .batch صورًا وتصنيفات متعددة في دفعة صغيرة. أخيرًا، يمكن .prefetch استخدام وحدة المعالجة المركزية لإعداد المجموعة التالية أثناء تدريب المجموعة الحالية على وحدة معالجة الرسومات.

يتم إعداد مجموعة بيانات التحقّق بطريقة مشابهة. نحن الآن مستعدون لتحديد نموذج واستخدام مجموعة البيانات هذه لتدريبه.

الخلية "نموذج Keras"

ستكون جميع نماذجنا عبارة عن تسلسلات مباشرة من الطبقات، لذا يمكننا استخدام نمط tf.keras.Sequential لإنشائها. في البداية هنا، تكون طبقة واحدة كثيفة. تحتوي هذه الطبقة على 10 عُقد عصبية لأنّنا نصنّف الأرقام المكتوبة بخط اليد إلى 10 فئات. تستخدم هذه الشبكة وظيفة التنشيط "softmax" لأنّها الطبقة الأخيرة في المصنّف.

يحتاج نموذج Keras أيضًا إلى معرفة شكل المدخلات. يمكن استخدام tf.keras.layers.Input لتحديدها. في هذه الحالة، تكون متجهات الإدخال متجهات مسطّحة لقيم وحدات البكسل بطول 28*28.

model = tf.keras.Sequential(
  [
    tf.keras.layers.Input(shape=(28*28,)),
    tf.keras.layers.Dense(10, activation='softmax')
  ])

model.compile(optimizer='sgd',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# print model layers
model.summary()

# utility callback that displays training curves
plot_training = PlotTraining(sample_rate=10, zoom=1)

يتم إعداد النموذج في Keras باستخدام الدالة model.compile. نستخدم هنا أداة التحسين الأساسية 'sgd' (النزول التدريجي العشوائي). يتطلّب نموذج التصنيف دالة خسارة الإنتروبيا المتداخلة، تُسمى 'categorical_crossentropy' في Keras. أخيرًا، نطلب من النموذج حساب مقياس 'accuracy'، وهو النسبة المئوية للصور المصنّفة بشكل صحيح.

توفّر Keras الأداة المساعدة model.summary() الرائعة التي تطبع تفاصيل النموذج الذي أنشأته. أضاف المدرّب اللطيف الأداة PlotTraining (المحدّدة في خلية "أدوات التصوّر") التي ستعرض منحنيات تدريب مختلفة أثناء التدريب.

الخلية "تدريب النموذج والتحقّق من صحته"

يتم التدريب هنا من خلال استدعاء model.fit وتمرير كلّ من مجموعتَي بيانات التدريب والتحقّق. تُجري Keras تلقائيًا عملية تحقّق في نهاية كل حقبة.

model.fit(training_dataset, steps_per_epoch=steps_per_epoch, epochs=EPOCHS,
          validation_data=validation_dataset, validation_steps=1,
          callbacks=[plot_training])

في Keras، يمكن إضافة سلوكيات مخصّصة أثناء التدريب باستخدام عمليات معاودة الاتصال. هذه هي الطريقة التي تم بها تنفيذ الرسم البياني للتدريب الذي يتم تعديله ديناميكيًا في ورشة العمل هذه.

الخلية "عرض التوقعات"

بعد تدريب النموذج، يمكننا الحصول على توقّعات منه من خلال استدعاء model.predict():

probabilities = model.predict(font_digits, steps=1)
predicted_labels = np.argmax(probabilities, axis=1)

لقد أعددنا هنا مجموعة من الأرقام المطبوعة المعروضة من الخطوط المحلية، وذلك كاختبار. تذكَّر أنّ الشبكة العصبية تعرض متجهًا من 10 احتمالات من دالة "softmax" النهائية. للحصول على التصنيف، علينا معرفة الاحتمالية الأكبر. تتيح لك الدالة np.argmax من مكتبة numpy إجراء ذلك.

لفهم سبب الحاجة إلى المَعلمة axis=1، يُرجى تذكُّر أنّنا عالجنا مجموعة من 128 صورة، وبالتالي يعرض النموذج 128 متّجهًا من الاحتمالات. يكون شكل موتر الإخراج [128, 10]. نحتسب argmax على مستوى الاحتمالات العشرة التي يتم عرضها لكل صورة، وبالتالي axis=1 (المحور الأول هو 0).

يتعرّف هذا النموذج البسيط على% 90 من الأرقام. لا بأس بهذه النتيجة، ولكنّك ستعمل الآن على تحسينها بشكل كبير.

396c54ef66fad27f.png

6. إضافة طبقات

godeep.png

لتحسين دقة التعرّف، سنضيف المزيد من الطبقات إلى الشبكة العصبية.

Screen Shot 2016-07-27 at 15.36.55.png

نحتفظ بدالة softmax كدالّة التفعيل في الطبقة الأخيرة لأنّها الأنسب للتصنيف. في الطبقات الوسيطة، سنستخدم دالة التنشيط الأكثر كلاسيكية: دالة سيغمويد:

41fc82288c4aff5d.png

على سبيل المثال، يمكن أن يبدو النموذج على النحو التالي (لا تنسَ الفواصل، تأخذ tf.keras.Sequential قائمة قيم مفصولة بفاصلة من الطبقات):

model = tf.keras.Sequential(
  [
      tf.keras.layers.Input(shape=(28*28,)),
      tf.keras.layers.Dense(200, activation='sigmoid'),
      tf.keras.layers.Dense(60, activation='sigmoid'),
      tf.keras.layers.Dense(10, activation='softmax')
  ])

اطّلِع على "ملخّص" النموذج. ويحتوي الآن على 10 أضعاف المَعلمات على الأقل. يجب أن يكون أفضل 10 مرات! ولكن لسبب ما، لا يمكن ذلك ...

5236f91ba6e07d85.png

يبدو أنّ الخسارة قد ارتفعت بشكل كبير أيضًا. هناك خطأ ما.

7. اعتبارات خاصة للشبكات العميقة

لقد جرّبت للتو الشبكات العصبونية، كما كان يصمّمها الأشخاص في الثمانينيات والتسعينيات. ولا عجب أنّهم تخلّوا عن الفكرة، ما أدّى إلى ما يُعرف باسم "خيبة الأمل في الذكاء الاصطناعي". في الواقع، كلما أضفت طبقات، زادت صعوبة تقارب الشبكات العصبونية.

تبيّن أنّ الشبكات العصبية العميقة التي تتضمّن العديد من الطبقات (20 أو 50 أو حتى 100 طبقة اليوم) يمكن أن تعمل بشكل جيد جدًا، شرط توفّر بعض الحيل الرياضية لجعلها تتقارب. إنّ اكتشاف هذه الحيل البسيطة هو أحد أسباب النهضة التي شهدها التعلّم العميق في العقد الأول من الألفية الثانية.

تفعيل RELU

relu.png

في الواقع، تشكّل دالة التنشيط السينية مشكلة كبيرة في الشبكات العميقة. فهي تقلّل جميع القيم بين 0 و1، وعندما تفعل ذلك بشكل متكرر، يمكن أن تختفي مخرجات الخلايا العصبية وتدرّجاتها تمامًا. تمت الإشارة إليه لأسباب تاريخية، ولكن تستخدم الشبكات الحديثة RELU (وحدة خطية معدَّلة) التي تبدو على النحو التالي:

1abce89f7143a69c.png

من ناحية أخرى، فإنّ دالة relu لها مشتقة تساوي 1، على الأقل على الجانب الأيمن. باستخدام تنشيط RELU، حتى إذا كانت التدرجات اللونية الواردة من بعض الخلايا العصبية صفرًا، ستكون هناك دائمًا خلايا أخرى تعطي تدرجًا لونيًا واضحًا غير صفري ويمكن أن يستمر التدريب بوتيرة جيدة.

أداة تحسين أفضل

في المساحات العالية الأبعاد، كما هو الحال هنا، حيث لدينا حوالي 10 آلاف من الأوزان والانحيازات، تكون "نقاط السرج" متكررة. هذه نقاط ليست الحد الأدنى المحلي، ولكن يكون فيها التدرّج صفرًا، ويبقى مُحسِّن نزول التدرّج عالقًا فيها. تتضمّن TensorFlow مجموعة كاملة من أدوات التحسين المتاحة، بما في ذلك بعض الأدوات التي تعمل مع مقدار من القصور الذاتي وستتجاوز نقاط السرج بأمان.

عمليات التهيئة العشوائية

إنّ فن تهيئة الأوزان والتحيزات قبل التدريب هو مجال بحثي بحد ذاته، وقد نُشرت العديد من الأوراق البحثية حول هذا الموضوع. يمكنك الاطّلاع على جميع أدوات التهيئة المتاحة في Keras هنا. لحسن الحظ، تتّبع Keras الإجراء الصحيح تلقائيًا وتستخدم أداة التهيئة 'glorot_uniform' التي تُعدّ الأفضل في جميع الحالات تقريبًا.

ليس عليك اتّخاذ أي إجراء، لأنّ Keras يتّخذ الإجراء المناسب تلقائيًا.

NaN ???

تتضمّن صيغة الإنتروبيا المتقاطعة لوغاريتمًا، وقيمة log(0) هي "ليس رقمًا" (NaN، وهو خطأ عددي إذا كنت تفضّل ذلك). هل يمكن أن يكون الإدخال إلى الإنتروبيا المتقاطعة 0؟ تأتي المدخلات من دالة softmax التي تكون أسية بشكل أساسي، ولا يمكن أن تكون الدالة الأسية صفرًا أبدًا. إذًا نحن بأمان.

حقًا؟ في عالم الرياضيات الجميل، سنكون في أمان، ولكن في عالم الكمبيوتر، فإنّ exp(-150) الممثَّلة بتنسيق float32 هي صفر تمامًا، وبالتالي يتعطّل حساب الإنتروبيا المتقاطعة.

لحسن الحظ، ليس عليك اتّخاذ أي إجراء هنا أيضًا، لأنّ Keras يتولّى ذلك ويحسب دالة softmax متبوعة بالإنتروبيا المتقاطعة بطريقة حذرة بشكل خاص لضمان الاستقرار العددي وتجنُّب قيم NaN المخيفة.

هل تمّت العملية بنجاح؟

e1521c9dd936d9bc.png

من المفترض أن تصل الآن إلى دقة تبلغ% 97. الهدف من ورشة العمل هذه هو تحقيق نسبة أعلى بكثير من% 99، لذا لنواصل العمل.

إذا واجهت صعوبة، إليك الحلّ في هذه المرحلة:

c3df49e90e5a654f.png keras_02_mnist_dense.ipynb

8. اضمحلال معدّل التعلّم

هل يمكننا محاولة التدريب بشكل أسرع؟ معدّل التعلّم التلقائي في محسِّن Adam هو 0.001. لنحاول زيادته.

لا يبدو أنّ زيادة السرعة تساعد كثيرًا، فما كل هذا التشويش؟

d4fd66346d7c480e.png

من الواضح أنّ منحنيات التدريب تتضمّن الكثير من التشويش، ويمكن ملاحظة ذلك في منحنيات التحقّق التي تتأرجح صعودًا وهبوطًا. وهذا يعني أنّنا نتحرّك بسرعة كبيرة. يمكننا العودة إلى السرعة السابقة، ولكن هناك طريقة أفضل.

slow down.png

الحلّ الجيّد هو البدء بسرعة وتقليل معدّل التعلّم بشكل كبير. في Keras، يمكنك إجراء ذلك باستخدام أداة tf.keras.callbacks.LearningRateScheduler.

رمز مفيد للنسخ واللصق:

# lr decay function
def lr_decay(epoch):
  return 0.01 * math.pow(0.6, epoch)

# lr schedule callback
lr_decay_callback = tf.keras.callbacks.LearningRateScheduler(lr_decay, verbose=True)

# important to see what you are doing
plot_learning_rate(lr_decay, EPOCHS)

لا تنسَ استخدام lr_decay_callback الذي أنشأته. أضِفها إلى قائمة الدوالّ التي يتم استدعاؤها في model.fit:

model.fit(...,  callbacks=[plot_training, lr_decay_callback])

ويُحدث هذا التغيير الصغير تأثيرًا كبيرًا. تلاحظ أنّ معظم التشويش قد اختفى وأنّ دقة الاختبار أصبحت الآن أعلى من% 98 بشكل مستمر.

8c1ae90976c4a0c1.png

9- التسرب، المطابقة بشكل مفرط

يبدو أنّ النموذج يتلاقى بشكل جيد الآن. لنحاول التوغّل أكثر في التفاصيل.

هل يساعد ذلك؟

e36c09a3088104c6.png

لا، فالدقة لا تزال ثابتة عند% 98، وانظر إلى فقدان التحقّق. إنّها ترتفع! تعمل خوارزمية التعلّم على بيانات التدريب فقط وتحسِّن خسارة التدريب وفقًا لذلك. ولا يرى أبدًا بيانات التحقّق، لذا ليس من المستغرب أن يتوقف عمله بعد فترة عن التأثير في خسارة التحقّق التي تتوقف عن الانخفاض، بل إنّها ترتفع أحيانًا.

لا يؤثّر ذلك على الفور في إمكانات التعرّف على العالم الحقيقي في نموذجك، ولكنّه سيمنعك من تنفيذ العديد من التكرارات، وهو بشكل عام علامة على أنّ التدريب لم يعُد له تأثير إيجابي.

dropout.png

يُطلق على هذا الانفصال عادةً اسم "التطابق الزائد"، وعندما تلاحظه، يمكنك محاولة تطبيق أسلوب تسوية يُعرف باسم "التسرب". تستهدف تقنية التسرب العصبونات العشوائية في كل تكرار للتدريب.

هل نجح الأمر؟

43fd33801264743f.png

تظهر الضوضاء مجددًا (وهذا أمر متوقّع نظرًا لطريقة عمل التقطّع). يبدو أنّ خسارة التحقّق لم تعد تتزايد، ولكنّها أعلى بشكل عام مما كانت عليه بدون التسرب. وانخفضت دقة التحقّق قليلاً. هذه نتيجة مخيّبة للآمال إلى حدّ ما.

يبدو أنّ عملية الحذف لم تكن الحلّ المناسب، أو ربما يكون "المطابقة بشكل مفرط" مفهومًا أكثر تعقيدًا ولا يمكن حلّ بعض أسبابه من خلال عملية الحذف.

ما هو "المطابقة بشكل مفرط"؟ يحدث فرط التخصيص عندما تتعلّم الشبكة العصبونية "بشكل سيئ"، بطريقة تناسب أمثلة التدريب ولكنها لا تناسب البيانات الواقعية. هناك أساليب تسوية، مثل التسرب، يمكن أن تجبر النموذج على التعلّم بطريقة أفضل، ولكن المطابقة بشكل مفرط لها أيضًا جذور أعمق.

overfitting.png

يحدث الإفراط الأساسي في التكيّف عندما يكون لدى الشبكة العصبونية عدد كبير جدًا من درجات الحرية للمشكلة المطروحة. لنفترض أنّ لدينا العديد من الخلايا العصبية التي يمكن للشبكة تخزين جميع صور التدريب فيها ثم التعرّف عليها من خلال مطابقة الأنماط. ولن ينجح في التعامل مع بيانات العالم الواقعي على الإطلاق. يجب أن تكون الشبكة العصبية محدودة إلى حد ما كي تضطر إلى تعميم ما تتعلمه أثناء التدريب.

إذا كانت لديك بيانات تدريب قليلة جدًا، يمكن حتى لشبكة صغيرة أن تحفظها عن ظهر قلب وستلاحظ "المطابقة بشكل مفرط". بشكل عام، تحتاج دائمًا إلى الكثير من البيانات لتدريب الشبكات العصبية.

أخيرًا، إذا كنت قد نفّذت كل الخطوات بشكل صحيح، وجرّبت أحجامًا مختلفة للشبكة للتأكّد من أنّ درجات الحرية محدودة، وطبّقت التسرب، وتدرّبت على الكثير من البيانات، قد تظلّ عالقًا عند مستوى أداء لا يبدو أنّ أي شيء يمكنه تحسينه. هذا يعني أنّ شبكتك العصبية، بشكلها الحالي، غير قادرة على استخراج المزيد من المعلومات من بياناتك، كما هو الحال هنا.

تذكَّر كيف نستخدم صورنا، التي تم دمجها في متّجه واحد؟ كانت تلك فكرة سيئة للغاية. تتكوّن الأرقام المكتوبة بخط اليد من أشكال، وقد تجاهلنا معلومات الأشكال عند تسوية وحدات البكسل. ومع ذلك، هناك نوع من الشبكات العصبية يمكنه الاستفادة من معلومات الشكل، وهو الشبكات الالتفافية. لنجرّبها.

إذا واجهت صعوبة، إليك الحلّ في هذه المرحلة:

c3df49e90e5a654f.png keras_03_mnist_dense_lrdecay_dropout.ipynb

10. [INFO] الشبكات الالتفافية

باختصار

إذا كنت تعرف جميع المصطلحات بالخط العريض في الفقرة التالية، يمكنك الانتقال إلى التمرين التالي. إذا كنت لا تزال مبتدئًا في استخدام الشبكات العصبونية الالتفافية، يُرجى مواصلة القراءة.

convolutional.gif

صورة توضيحية: فلترة صورة باستخدام فلترَين متتاليَين يتألف كل منهما من 48 وزنًا قابلاً للتعلم (4x4x3).

إليك الشكل الذي تبدو عليه شبكة عصبونية التفافية بسيطة في Keras:

model = tf.keras.Sequential([
    tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(kernel_size=3, filters=12, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=24, strides=2, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=32, strides=2, activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation='softmax')
])

688858c21e3beff2.png

في إحدى طبقات الشبكة الالتفافية، تقوم إحدى "الخلايا العصبية" بإجراء مجموع مرجّح لوحدات البكسل التي تعلوها مباشرةً، وذلك على مستوى منطقة صغيرة من الصورة فقط. تضيف هذه الطبقة انحيازًا وتمرّر المجموع من خلال دالّة التفعيل، تمامًا كما يفعل عصبون في طبقة كثيفة عادية. يتم بعد ذلك تكرار هذه العملية على مستوى الصورة بأكملها باستخدام الأوزان نفسها. تذكَّر أنّه في الطبقات الكثيفة، كان لكل عصبون أوزانه الخاصة. في هذه الحالة، تنزلق "رقعة" واحدة من الأوزان على الصورة في كلا الاتجاهين (وهي عملية "التفاف"). يحتوي الناتج على عدد من القيم يساوي عدد وحدات البكسل في الصورة (مع ضرورة إضافة بعض المساحة المتروكة على الحواف). وهي عملية فلترة. في الصورة التوضيحية أعلاه، يتم استخدام فلتر يتضمّن 48 وزنًا، أي 4x4x3=48.

ومع ذلك، لن تكون 48 قيمة كافية. لإضافة المزيد من درجات الحرية، نكرّر العملية نفسها باستخدام مجموعة جديدة من معاملات الترجيح. يؤدي ذلك إلى إنشاء مجموعة جديدة من نتائج الفلتر. لنسمِّها "قناة" للنتائج، وذلك قياسًا على قنوات الأحمر والأخضر والأزرق في الصورة المدخلة.

Screen Shot 2016-07-29 at 16.02.37.png

يمكن جمع مجموعتَي الأوزان (أو أكثر) في موتر واحد عن طريق إضافة بُعد جديد. يمنحنا هذا الشكل العام لموتر الأوزان في الطبقة الالتفافية. بما أنّ عدد قنوات الإدخال والإخراج هي مَعلمات، يمكننا البدء في ترتيب الطبقات الالتفافية وتجميعها.

d1b557707bcd1cb9.png

صورة توضيحية: تحوّل شبكة عصبية التفافية "مكعبات" البيانات إلى "مكعبات" أخرى من البيانات.

الالتفافات المخطَّطة، تجميع الحد الأقصى

من خلال إجراء عمليات الالتفاف بخطوة 2 أو 3، يمكننا أيضًا تقليل حجم مكعّب البيانات الناتج في أبعاده الأفقية. هناك طريقتان شائعتان لإجراء ذلك:

  • الالتفاف بخطوات متقطّعة: فلتر منزلق كما هو موضّح أعلاه ولكن بخطوة >1
  • التجميع الأقصى: نافذة منزلقة تطبّق عملية MAX (عادةً على رقع 2x2، يتم تكرارها كل بكسلَين)

2b2d4263bb8470b.gif

توضيح: يؤدي تحريك نافذة الحساب بمقدار 3 وحدات بكسل إلى الحصول على عدد أقل من قيم الإخراج. تُعدّ الالتفافات المخطوة أو التجميع الأقصى (الحد الأقصى في نافذة 2x2 تنزلق بخطوة 2) طريقة لتقليص مكعب البيانات في الأبعاد الأفقية.

الطبقة النهائية

بعد آخر طبقة التفافية، تكون البيانات على شكل "مكعّب". هناك طريقتان لتغذيتها من خلال الطبقة الكثيفة النهائية.

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

بدلاً من استخدام طبقة كثيفة مكلفة، يمكننا أيضًا تقسيم "المكعب" الوارد إلى أكبر عدد ممكن من الأجزاء التي تتضمّن فئات، ثم حساب متوسط قيمها وإدخالها من خلال دالة تنشيط softmax. لا تتطلّب طريقة إنشاء رأس التصنيف هذه أي أوزان. في Keras، هناك طبقة لهذا الغرض: tf.keras.layers.GlobalAveragePooling2D().

a44aa392c7b0e32a.png

انتقِل إلى القسم التالي لإنشاء شبكة عصبية التفافية للمشكلة المطروحة.

11. شبكة التفافية

لننشئ شبكة عصبية التفافية للتعرّف على الأرقام المكتوبة بخط اليد. سنستخدم ثلاث طبقات التفافية في الأعلى، وطبقة قراءة softmax التقليدية في الأسفل، ونربطها بطبقة واحدة متصلة بالكامل:

e1a214a170957da1.png

لاحظ أنّ الطبقتَين الالتفافيتَين الثانية والثالثة تتضمّنان خطوة بمقدار اثنَين، ما يفسّر سبب خفض عدد القيم الناتجة من 28×28 إلى 14×14 ثم إلى 7×7.

لنكتب رمز Keras البرمجي.

يجب الانتباه بشكل خاص قبل الطبقة الالتفافية الأولى. في الواقع، يتوقّع هذا النموذج مكعّبًا ثلاثي الأبعاد من البيانات، ولكن تم حتى الآن إعداد مجموعة البيانات الخاصة بنا للطبقات الكثيفة، وتم تسوية جميع وحدات البكسل في الصور إلى متّجه. علينا إعادة تشكيلها إلى صور بحجم 28x28x1 (قناة واحدة للصور ذات التدرّج الرمادي):

tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1))

يمكنك استخدام هذا السطر بدلاً من طبقة tf.keras.layers.Input التي كنت تستخدمها حتى الآن.

في Keras، يكون بناء الجملة لطبقة التفافية مُنشَّطة باستخدام "relu" كما يلي:

140f80336b0e653b.png

tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu')

بالنسبة إلى الالتفاف بخطوات متقطّعة، يمكنك كتابة:

tf.keras.layers.Conv2D(kernel_size=6, filters=24, padding='same', activation='relu', strides=2)

لتحويل مكعّب بيانات إلى متّجه يمكن أن تستخدمه طبقة كثيفة:

tf.keras.layers.Flatten()

بالنسبة إلى الطبقة الكثيفة، لم يتغيّر بناء الجملة:

tf.keras.layers.Dense(200, activation='relu')

هل تجاوز نموذجك حاجز الدقة البالغ% 99؟ قريب جدًا... ولكن انظر إلى منحنى فقدان صحة البيانات. هل يبدو ذلك مألوفًا؟

ecc5972814885226.png

اطّلِع أيضًا على التوقّعات. للمرة الأولى، من المفترض أن تلاحظ أنّه تم الآن التعرّف على معظم الأرقام العشرة آلاف التجريبية بشكل صحيح. يتبقى حوالي 4 صفوف ونصف من عمليات الرصد الخاطئة (حوالي 110 أرقام من أصل 10,000)

37e4cbd3f390c89e.png

إذا واجهت صعوبة، إليك الحلّ في هذه المرحلة:

c3df49e90e5a654f.png keras_04_mnist_convolutional.ipynb

12. التوقف عن المشاهدة مرة أخرى

يُظهر التدريب السابق علامات واضحة على المطابقة بشكل مفرط (ولا يزال أقل من 99% من الدقة). هل يجب أن نحاول استخدام التسرب مرة أخرى؟

كيف كانت النتيجة هذه المرة؟

63e0cc982cee2030.png

يبدو أنّ ميزة "التوقف عن المشاهدة" قد نجحت هذه المرة. لم يعُد معدّل الخطأ في بيانات التحقّق يرتفع، ومن المفترض أن تكون الدقة النهائية أعلى بكثير من %99. تهانينا!

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

في هذه الحالة، يبدو أنّ الإفراط في التكيّف كان سبب المشكلة، وقد ساعدت عملية الحذف في حلّها. تذكَّر أنّ هناك العديد من الأسباب التي يمكن أن تؤدي إلى حدوث اختلاف بين منحنيَي خسارة التدريب والتحقّق، مع ارتفاع خسارة التحقّق. الإفراط في التكيّف (عدد كبير جدًا من درجات الحرية، تستخدمه الشبكة بشكل سيئ) هو أحد هذه الأسباب فقط. إذا كانت مجموعة البيانات صغيرة جدًا أو لم تكن بنية الشبكة العصبية مناسبة، قد تلاحظ سلوكًا مشابهًا في منحنيات الفقدان، ولكن لن يساعدك التوقف المؤقت.

13. التسوية على دفعات

oggEbikl2I6_sOo7FlaX2KLdNeaYhJnVSS8GyG8FHXid75PVJX73CRiOynwpMZpLZq6_xAy69wgyez5T-ZlpuC2XSlcmjk7oVcOzefKKTFhTEoLO3kljz2RDyKcaFtHvtTey-I4VpQ

أخيرًا، لنحاول إضافة تسوية الدفعات.

هذه هي النظرية، ولكن في الواقع، ما عليك سوى تذكُّر قاعدتين:

لنلتزم بالأساسيات في الوقت الحالي ونضيف طبقة تسوية الدفعات إلى كل طبقة من طبقات الشبكة العصبية باستثناء الطبقة الأخيرة. لا تُضِفها إلى الطبقة الأخيرة من "softmax". ولن يكون مفيدًا هناك.

# Modify each layer: remove the activation from the layer itself.
# Set use_bias=False since batch norm will play the role of biases.
tf.keras.layers.Conv2D(..., use_bias=False),
# Batch norm goes between the layer and its activation.
# The scale factor can be turned off for Relu activation.
tf.keras.layers.BatchNormalization(scale=False, center=True),
# Finish with the activation.
tf.keras.layers.Activation('relu'),

ما مدى دقة المعلومات الآن؟

ea48193334c565a1.png

مع بعض التعديلات (BATCH_SIZE=64، ومعلَمة انخفاض معدل التعلّم 0.666، ومعدل التسرب في الطبقة الكثيفة 0.3) وبعض الحظ، يمكنك الوصول إلى ‎99.5%. تم إجراء تعديلات على معدّل التعلّم ومعدّل التسرب وفقًا "لأفضل الممارسات" لاستخدام التوحيد الدفعي:

  • تساعد عملية التسوية الدفعية الشبكات العصبونية على التقارب وتتيح لك عادةً التدريب بشكل أسرع.
  • تُعدّ التسوية الدفعية أداة تسوية. يمكنك عادةً تقليل مقدار التسرب الذي تستخدمه، أو حتى عدم استخدامه على الإطلاق.

يحتوي دفتر الملاحظات الخاص بالحلّ على عملية تدريب بنسبة% 99.5:

c3df49e90e5a654f.png keras_05_mnist_batch_norm.ipynb

14. التدريب في السحابة الإلكترونية على أجهزة قوية: AI Platform

d7d0282e687bdad8.png

ستجد نسخة من الرمز البرمجي جاهزة للاستخدام على السحابة الإلكترونية في مجلد mlengine على GitHub، بالإضافة إلى تعليمات لتشغيلها على Google Cloud AI Platform. قبل تشغيل هذا الجزء، عليك إنشاء حساب على Google Cloud وتفعيل الفوترة. يجب أن تكون الموارد اللازمة لإكمال المختبر أقل من بضعة دولارات (بافتراض ساعة واحدة من وقت التدريب على وحدة معالجة رسومات واحدة). لإعداد حسابك، اتّبِع الخطوات التالية:

  1. أنشئ مشروعًا على Google Cloud Platform ( http://cloud.google.com/console).
  2. فعِّل الفوترة.
  3. ثبِّت أدوات سطر الأوامر في Google Cloud Platform ( GCP SDK هنا).
  4. أنشئ حزمة في Google Cloud Storage (ضَعها في المنطقة us-central1)، وسيتم استخدامها لتنظيم رمز التدريب وتخزين النموذج المدرَّب.
  5. فعِّل واجهات برمجة التطبيقات اللازمة واطلب الحصص اللازمة (نفِّذ أمر التدريب مرة واحدة وستتلقّى رسائل خطأ تخبرك بما يجب تفعيله).

15. تهانينا!

لقد أنشأت أول شبكة عصبية ودربتها حتى بلغت دقتها% 99. إنّ الأساليب التي تعلّمناها على طول الطريق ليست خاصة بمجموعة بيانات MNIST، بل يتم استخدامها على نطاق واسع عند العمل مع الشبكات العصبونية. كهدية وداع، إليك بطاقة "ملخّص" عن المختبر، في نسخة كرتونية. يمكنك استخدامها لتذكُّر ما تعلّمته:

cliffs notes tensorflow lab.png

الخطوات التالية

  • بعد الشبكات العصبونية المتصلة بالكامل والشبكات العصبونية الالتفافية، عليك إلقاء نظرة على الشبكات العصبونية المتكررة.
  • لتنفيذ التدريب أو الاستنتاج في السحابة الإلكترونية على بنية أساسية موزّعة، يوفّر Google Cloud خدمة AI Platform.
  • أخيرًا، يسرّنا تلقّي ملاحظاتك. يُرجى إعلامنا إذا لاحظت أي خطأ في هذا المختبر أو إذا كنت تعتقد أنّه يجب تحسينه. نتعامل مع الملاحظات من خلال المشاكل التي يتم الإبلاغ عنها في GitHub [ رابط الملاحظات].

HR.png

Martin Görner ID small.jpgالكاتب: مارتن غورنرTwitter: @martin_gorner

جميع صور الرسوم المتحركة في هذا المختبر محمية بموجب حقوق الطبع والنشر: alexpokusay / 123RF stock photos