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

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

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

ما ستتعرَّف عليه

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

الأشياء التي تحتاج إليها

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

الملاحظات

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

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

Welcome to Colab.ipynb

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

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

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

تنفيذ مفكرات

نفِّذ الخلايا واحدة تلو الأخرى عن طريق النقر على خلية واستخدام Shift-ENTER. يمكنك أيضًا تشغيل دفتر الملاحظات بالكامل باستخدام Runtime > Run all (تشغيل الكل).

جدول المحتوى

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

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

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

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

keras_01_mnist.ipynb

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

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

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

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

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

التدريب

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

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

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

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

التوقّعات

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

كما ترى، هذا النموذج الأوليّ ليس جيدًا جدًا ولكنه ما زال يتعرّف على بعض الأرقام بشكلٍ صحيح. وتصل دقتها النهائية إلى 90%، وهي نسبة سيئة للغاية بالنسبة إلى النموذج البسيط الذي نبدأ به، ولكنها لا تزال تعني أنها فاتت 1000 رقم تحقق من أصل 10000. إنّ عدد الإجابات أكبر من العدد الظاهر، ولهذا السبب يبدو أنّ كل الإجابات غير صحيحة (باللون الأحمر).

أجهزة الاستشعار

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

وتسمى هذه الجداول متعددة الأبعاد "Tensors" وقائمة أبعادها هي "shape".

باختصار

إذا كانت جميع العبارات الواردة في غامق في الفقرة التالية معروفة لك، يمكنك الانتقال إلى التمرين التالي. إذا كنت قد بدأت للتو في التعلّم المتعمّق، يُرجى مواصلة القراءة.

سَاحِرَة

بالنسبة إلى النماذج التي تم إنشاؤها كتسلسل للطبقات، تقدّم Keras واجهة برمجة التطبيقات التسلسلية. على سبيل المثال، يمكن كتابة أداة تصنيف صور تحتوي على ثلاث طبقات كثيفة في 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, ... )

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

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

لقطة شاشة يوم 26-07-2016 في الساعة 12.32.24.png

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

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

من خلال ضرب المصفوفة

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

mamul.gif

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

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

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

لقطة شاشة يوم 26-07-2016 في الساعة 16.02.36.png

في Keras

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

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

التعمّق

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

سيكون الاختلاف الوحيد، بغض النظر عن عدد الخلايا العصبية، هو خيار وظيفة التفعيل.

وظائف التفعيل: relu وsoftmax وsigmoid

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

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

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

وكانت وظيفة التفعيل التقليدية في الشبكات العصبونية هي "sigmoid" لكن تبيّن أن عامل التشغيل &relu" يتميّز بخصائص تقارب أفضل في كل مكان تقريبًا ويُفضّل استخدامه الآن.

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

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

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

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

فقدان إنتروبيا

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

وأي مسافة يمكن أن تكون مفيدة، ولكن بالنسبة إلى مشاكل التصنيف التي تُعرف باسم "&&;;cross-entropy المسافة" هي الأكثر فعالية. سنُطلق على هذه الوظيفة اسم الخطأ أو "الخسارة":

النزول التدريجي

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

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

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

تحليل منحدر 2.png

التجميع الدقيق والزخم

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

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

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

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

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

المسرد

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

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

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

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

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

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

logits: تُسمى مخرجات طبقة الخلايا العصبية قبل تطبيق وظيفة التفعيل &"logits". إنّ المصطلح يأتي من دالة &&بدءًا: "الدالة اللوجستية"، وتُعرف أيضًا باسم "دالة &sigmoid". تقصير &حصص العصير قبل الدالة اللوجستية،

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

neuron: تحسب المجموع المرجّح لإدخالاتها، وتضيف الانحياز وتغذّي النتيجة من خلال دالة تفعيل.

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

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

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

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

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

رجوع إلى دفتر الملاحظات وهذا الوقت، لنقرأ الرمز.

keras_01_mnist.ipynb

لنستعرض جميع الخلايا في هذه المفكرة.

خلية &quot؛المعلَمات&quot؛

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

&&Cell;Import;Import;"

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

&& XML;مرئية عن المرافق [تشغيل الركّاب]"

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

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

استخدمت هذه الخلية واجهة برمجة التطبيقات tf.data.Dataset لتحميل مجموعة بيانات MNIST من ملفات البيانات. ليس من الضروري قضاء الكثير من الوقت على هذه الخلية. إذا كنت مهتمًّا بـ tf.data.Dataset API، إليك برنامج تعليمي يوضّح ذلك: مسارات بيانات TPU-speed. في ما يلي الأساسيات في الوقت الحالي:

يتم تخزين الصور والتصنيفات (الإجابات الصحيحة) من مجموعة بيانات 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.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 API جميع وظائف الخدمات اللازمة لإعداد مجموعات البيانات:

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

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

&الاستمارة&كيفراس

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

يحتاج نموذج 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 (المحدّدة في &معرّف الخدمات المساعدة على التمثيل البصري&&quot؛ والتي ستعرض منحنيات التدريب المختلفة أثناء التدريب.

&نقل بيانات "الخلايا" والتحقّق من صحتها والتحقّق من صحتها

هذا هو مكان التدريب، من خلال استدعاء 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 احتمالات من المعادلة النهائية ";maxmax". للحصول على التصنيف، يجب أن نحدد الاحتمالية الأعلى. ينفّذ np.argmax هذا الإجراء من مكتبة الأرقام.

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

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

Godeep.png

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

لقطة شاشة يوم 27-07-2016 في الساعة 15.36.55.png

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

على سبيل المثال، يمكن أن يظهر النموذج كما يلي (لا تنس الفواصل، وسوف يأخذ 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')
  ])

ألقِ نظرة على &quot؛الملخّص&كيفيّة تحتوي الآن على معلمات إضافية تبلغ 10 أضعاف على الأقل. يجب أن تكون أفضل 10 أضعاف. ولكن، لسبب ما، لا ...

يبدو أن الخسارة قد وقعت من خلال السقف أيضًا. حدث خطأ ما.

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

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

تفعيل ReLU

relu.png

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

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

مُحسِّن أفضل

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

عمليات الإعداد العشوائية

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

لا يلزمك اتخاذ أي إجراء، بما أن شركة Keras تنفذ الإجراء الصحيح.

اسم Nan ؟

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

حقًا؟ في عالم الرياضيات، يمكننا تعزيز الأمان، ولكن في عالم الكمبيوتر، تشير exp(-150) والممثّلة بتنسيق البيانات العائمة 32 إلى قيمة صفرية كما هو الحال مع عدد مرات التعطّل على الإنترنت.

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

تمّ بنجاح؟

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

إذا واجهتك مشكلة، إليك الحل في هذه المرحلة:

keras_02_mnist_dense.ipynb

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

في المقابل، هل أسرعت كثيرًا في الحديث؟

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

إبطاء.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% بشكل مستدام.

يبدو أن النموذج يتقارب بشكل جيد الآن. لنحاول البحث بشكل أعمق.

هَلْ دَهْ مُفِيدْ؟

وفي واقع الأمر، لا تزال الدقة عالقة عند نسبة 98% وتنظر في فقدان التحقّق. إِنَّهُ يَتَّجِهُ إِلَى الْأَعْلَى. تعمل خوارزمية التعلّم على بيانات التدريب فقط وتُحسِّن نسبة فقدان التدريب وفقًا لذلك. ولا تطّلع Google أبدًا على بيانات التحقّق من الصحة، لذا لا عجب من أنّ إزالتها خلال فترة من الوقت لم تعد تؤثّر في فقدان التحقّق الذي يتوقف عن الانخفاض، بل قد يرتد أحيانًا.

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

استبعاد.png

عادةً ما يُطلق على عملية قطع الاتصال هذه &"overfitting" وعند رؤيتها، يمكنك محاولة تطبيق إحدى أساليب التسوية باسم "Dropout". يسجّل أسلوب الإسقاط عصبون عشوائيًا في كل تكرار تدريب.

هل نجح الأمر؟

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

يبدو أنّ التوقّف عن العمل لم يكن الحلّ الصحيح، أو قد يكون ذلك "معقّدًا":

ما المقصود بـ "overfitting"? يحدث التعطّل عند تعلُّم الشبكة العصبونية في المواقِع &بشكل سيئ، بطريقة تتناسب مع أمثلة التدريب، ولكن لا تُحقّق أداءً جيدًا مع البيانات الفعلية. هناك أساليب منتظمة للانتشار، يمكن أن تؤدي إلى إجبار الطفل على التعلّم بطريقة أفضل، بالإضافة إلى أنّه أكثر من غيره أيضًا.

Overfitting.png

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

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

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

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

إذا واجهتك مشكلة، إليك الحل في هذه المرحلة:

keras_03_mnist_dense_lrdecay_dropout.ipynb

باختصار

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

كونفال

الرسم التوضيحي: فلترة صورة من خلال فلترَين متتاليَين يتألّف من 4×4=38 من القيم القابلة للتعلّم.

في ما يلي الشكل الذي تبدو عليه الشبكة العصبونية الملتوية البسيطة في "كيراس":

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')
])

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

ومع ذلك، لن يكفي 48 ترجيحًا. لإضافة المزيد من درجات الحرية، نكرر العملية نفسها باستخدام مجموعة جديدة من الأوزان. وينتج عن ذلك مجموعة جديدة من مخرجات الفلاتر. لنطلق عليها اسم "&اسم القناة" أو "الم مصدر" الخاص بها من خلال مقارنة مع قنوات R وG وB في الصورة المدخلة.

لقطة شاشة يوم 29-07-2016 في الساعة 16.02.37.png

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

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

الخلطات المتوسّطة والتجميع الأقصى

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

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

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

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

بعد آخر طبقة احترافية، تكون البيانات على شكل " &cu;&be". هناك طريقتان لإطعامها من خلال الطبقة الكثيفة.

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

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

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

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

نلاحظ أنّ الطبقات التلتفية الثانية والثالثة تتّبع خطوتَين توضّحان سبب انخفاض عدد قيم الإخراج من 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' " التي تم تفعيلها هي:

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%؟ يجب إغلاق... لكن انظر إلى منحنى فقدان التحقق. هل يرنّ الجرس؟

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

إذا واجهتك مشكلة، إليك الحل في هذه المرحلة:

keras_04_mnist_convolutional.ipynb

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

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

يبدو أنّه قد انتهى هذا العام. لم تعد زيادة نسبة التحقّق من الصحة ترتفع أكثر من 99%. تهانينا.

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

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

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

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

لنلعب بواسطة الكتاب في الوقت الحالي ونضيف طبقة معيارية مُجمَّعة على كل طبقة شبكة عصبونية ولكن الطبقة الأخيرة. يجب عدم إضافته إلى آخر الطبقة &"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'),

ما رأيك في الدقة الآن؟

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

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

سجَّل دفتر الملاحظات حول الحل تدريبًا بنسبة 99.5%:

keras_05_mnist_batch_norm.ipynb

ستجد نسخة مُعدَّة للسحابة الإلكترونية من الرمز في مجلد mlengine على GitHub، بالإضافة إلى تعليمات للتشغيل على منصة Google Cloud AI. قبل أن تتمكَّن من تشغيل هذا الجزء، عليك إنشاء حساب على 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. فعِّل واجهات برمجة التطبيقات اللازمة واطلب الحصص اللازمة (نفِّذ الأمر التدريب مرة واحدة وستظهر لك رسائل خطأ تخبرك بما يجب تفعيله).

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

ملاحظات على منحدرات TensorFlab.png

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

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

HR.png

رقم تعريف مارتن غورنر الصغير.jpg

المؤلف: مارتن غورنر

Twitter: @martin_gorner

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