نموذجك الأول من نوع Keras مع التعلّم المنقول

1. نظرة عامة

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

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

هذه التجربة هي الجزء 2 من سلسلة "Keras على وحدات معالجة النطاق الفائق (TPU)". ويمكنك تنفيذها بالترتيب التالي أو بشكل مستقل.

ca8cc21f6838eccc.png

المُعطيات

  • لإنشاء مُصنِّف صور Keras باستخدام طبقة softmax وفقدان الطاقة عبر الإنتروبيا
  • لاستخدام الخداع 😈، يمكنك استخدام ميزة "التعلم التحويلي" بدلاً من إنشاء نماذجك الخاصة.

الملاحظات

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

2. البدء السريع لاستخدام Google Colaboratory

يستخدم هذا المختبر Google Collaboratory ولا يتطلّب أي إعداد من جانبك. Colaboratory هي منصة دفاتر ملاحظات على الإنترنت لأغراض تعليمية. وهو يوفر تدريبًا مجانيًا على استخدام وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات ووحدة معالجة الموتّرات.

688858c21e3beff2.png

يمكنك فتح نموذج دفتر ملاحظات هذا والاطّلاع على بضع خلايا للتعرّف على Colaboratory.

c3df49e90e5a654f.png Welcome to Colab.ipynb

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

8832c6208c99687d.png

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

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

76d05caa8b4db6da.png

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

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

429f106990037ec4.png

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

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

edc3dba45d26f12a.png

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

المصادقة

cdd4b41413100543.png

يمكن لمنصة Colab الوصول إلى حِزمك الخاصة في Google Cloud Storage شرط أن تتم المصادقة باستخدام حساب مفوَّض. سيؤدي مقتطف الرمز أعلاه إلى بدء عملية مصادقة.

3- [معلومات] أساسيات مصنِّف الشبكات العصبية

باختصار

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

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

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 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

الشبكة العصبونية الكثيفة

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

c21bae6dade487bc.png

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

الخلايا العصبية وعمليات التفعيل وخوارزمية RELU

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

644f4213a4ee70e5.png

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

تفعيل Softmax

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

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

ef0d98c0952c262d.png d51252f75894479e.gif

الخسارة العابرة للإنتروبيا

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

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

7bdf8753d20617fb.png

انحدار التدرج

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

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

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

gradient descent2.png

التجميع السريع والزخم

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

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

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

52e824fe4716c4a0.png

صورة توضيحية: نقطة سرج. يكون التدرّج 0 ولكنّه ليس الحدّ الأدنى في جميع الاتجاهات. (معلومات تحديد مصدر الصورة ويكيميديا: من إنشاء Nicoguaro، CC BY 3.0)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. التعلّم القائم على نقل المهام

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

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

التدريب العملي

يُرجى فتح دفتر البيانات التالي وتنفيذ الخلايا (Shift-ENTER) واتّباع التعليمات كلما ظهر لك تصنيف "مطلوب إجراء".

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

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

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

b8fc1efd2001f072.png

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

نقل التعلّم في Keras

في Keras، يمكنك إنشاء مثيل لنموذج مدرَّب مسبقًا من مجموعة tf.keras.applications.*. على سبيل المثال، يعد MobileNet V2 بنية التفافية جيدة للغاية تظل في الحجم معقولاً. عند اختيار include_top=False، ستحصل على النموذج المدرَّب مسبقًا بدون طبقة softmax النهائية بحيث يمكنك إضافة نموذجك الخاص:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

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

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

يُفترض أن تصل الدقة إلى نسبة تقترب من 75% بهذه الطريقة.

الحلّ

ها هو دفتر الحل. يمكنك استخدامها إذا واجهت مشكلة.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

المواضيع التي تناولناها

  • 🤔 كيفية كتابة مصنّف في Keras
  • 🤓 تكتمل باستخدام الطبقة الأخيرة softmax، وفقدان الطاقة بين الإنتروبيا.
  • 😈 التعلّم القائم على نقل المهام
  • 🎉 تدريب نموذجك الأول
  • 🧐 بعد فقدانها ودقتها أثناء التدريب

يُرجى تخصيص بعض الوقت لمراجعة قائمة التحقّق هذه.

5- تهانينا!

يمكنك الآن إنشاء نموذج Keras. يُرجى المتابعة إلى التمرين المعملي التالي لمعرفة كيفية تجميع الطبقات الالتفافية.

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

تتوفّر وحدات معالجة الموتّرات ووحدات معالجة الرسومات على Cloud AI Platform:

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

HR.png

معرّف مارتن غورنر صغير.jpg
المؤلف: "مارتن غورنر"
Twitter: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org