منصات غنائية حديثة، سرير كيسزينت، جهاز Xception، مع وحدات معالجة الموتّرات ووحدات معالجة الموتّرات

1. نظرة عامة

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

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

هذا التمرين هو الجزء الرابع من سلسلة "Keras on TPU". ويمكنك تنفيذها بالترتيب التالي أو بشكل مستقل.

ca8cc21f6838eccc.png

المُعطيات

  • لإتقان النمط الوظيفي في Keras
  • لإنشاء نموذج باستخدام بنية squeezenet
  • استخدام وحدات معالجة الموتّرات من أجل التدريب بسرعة وتكرار الجوانب الهندسية
  • لتنفيذ ميزة "زيادة البيانات" باستخدام tf.data.dataset
  • لتحسين نموذج كبير تمّ إعداده مسبقًا (Xception) على TPU

الملاحظات

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

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

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

688858c21e3beff2.png

يمكنك فتح نموذج ورقة الملاحظات هذا وتشغيله في خليتين للتعرّف على Colaboratory.

c3df49e90e5a654f.png Welcome to Colab.ipynb

اختيار إحدى خلفيات وحدة معالجة الموتّرات

8832c6208c99687d.png

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

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

76d05caa8b4db6da.png

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

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

429f106990037ec4.png

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

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

edc3dba45d26f12a.png

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

المصادقة

cdd4b41413100543.png

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

3- [معلومات] ما هي وحدات معالجة الموتّرات (TPU)؟

الملخّص

f88cf6facfc70166.png

رمز تدريب نموذج على وحدة معالجة الموتّرات في Keras (والرجوع إلى وحدة معالجة الرسومات أو وحدة المعالجة المركزية في حال عدم توفّر وحدة معالجة الموتّرات):

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

سنستخدم وحدات TPU اليوم لإنشاء وتحسين معرِّف للزهور بسرعات تفاعلية (دقائق لكل عملية تدريب).

688858c21e3beff2.png

ما هي أسباب استخدام وحدات معالجة الموتّرات؟

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

8eb3e718b8e2ed08.png

صورة توضيحية: طبقة شبكة عصبية كثيفة على شكل عملية ضرب مصفوفة، مع مجموعة من ثماني صور تتم معالجتها من خلال الشبكة العصبية في آنٍ واحد يرجى تنفيذ عملية ضرب العمود في سطر واحد للتأكد من أنها تُخرِج مجموع ترجيح لجميع قيم وحدات البكسل في الصورة. يمكن أيضًا تمثيل الطبقات التجميعية على أنّها عمليات ضرب مصفوفات، على الرغم من أنّها أكثر تعقيدًا قليلاً (الشرح هنا في القسم 1).

الأجهزة

MXU وVPU

يتكوّن الإصدار الثاني من وحدة معالجة الموتّرات من وحدة مصفوفة مصفوفة (MXU) تعمل على تنفيذ عمليات ضرب المصفوفة ووحدة معالجة المتّجهات (VPU) لجميع المهام الأخرى مثل عمليات التفعيل وsoftmax وغير ذلك. ويعالج VPU العمليات الحسابية float32 وint32. من ناحية أخرى، تعمل وحدة قياس الأداء (MXU) بتنسيق نقطة عائمة بدقة مختلطة 16-32 بت.

7d68944718f76b18.png

النقطة العائمة ذات الدقة المختلطة وbfloat16

تُحسِّب وحدة MXU عمليات ضرب المصفوفات باستخدام مدخلات bfloat16 ومخرجات float32. يتم إجراء عمليات التجميع الوسيطة بدقة float32.

19c5fc432840c714.png

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

لهذا السبب، طرحت Google تنسيق bfloat16 في وحدات TPU. وbfloat16 هو تنسيق float32 مقطوع يتضمّن القيمة نفسها تمامًا لبتّي الأس والفاصل كما في float32. بالإضافة إلى ذلك، تُحسِّن وحدات TPU عمليات ضرب المصفوفات بدقة مختلطة باستخدام مدخلات bfloat16 ولكن بمخرجات float32، ما يعني أنّه لا يلزم عادةً إجراء أي تغييرات على الرموز البرمجية للاستفادة من التحسينات في الأداء الناتجة عن انخفاض الدقة.

المصفوفة الانسيابية

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

العنصر الأساسي لعملية ضرب المصفوفة هو ناتج الضرب النقطي بين خط من مصفوفة واحدة وعمود من المصفوفة الأخرى (راجع الرسم التوضيحي أعلى هذا القسم). بالنسبة لعملية ضرب المصفوفة Y=X*W، سيكون أحد عناصر النتيجة هو:

Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]

في وحدة معالجة الرسومات، يتم برمجة هذا الضرب النقطي إلى "نواة" في وحدة معالجة الرسومات، ثم تنفيذه على أكبر عدد ممكن من "النواة" بالتوازي لمحاولة حساب كل قيمة في المصفوفة الناتجة دفعة واحدة. إذا كانت المصفوفة الناتجة كبيرة بحجم 128×128، فقد يتطلب ذلك توفر "نواة" قيمتها 128x128=16K، وهو أمر لا يكون ممكنًا عادةً. تحتوي أكبر وحدات معالجة الرسومات على 4,000 نواة تقريبًا. من ناحية أخرى، تستخدم وحدة معالجة الموتّرات الحدّ الأدنى من الأجهزة لوحدات الحوسبة في وحدة معالجة الموتّرات (MXU): bfloat16 x bfloat16 => float32 مُراكمات الضرب فقط، وليس هناك أي شيء آخر. هذه العمليات صغيرة جدًا لدرجة أنّ وحدة TPU يمكنها تنفيذ 16 ألف عملية منها في وحدة MXU بحجم 128x128 ومعالجة عملية ضرب المصفوفات هذه دفعة واحدة.

f1b283fc45966717.gif

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

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

Cloud TPU

عند طلب وحدة Cloud TPU من الجيل الثاني على Google Cloud Platform، ستحصل على جهاز افتراضي يحتوي على لوحة TPU متصلة بوحدة PCI. تحتوي لوحة TPU على أربع شرائح TPU ثنائية النواة. يتميز كل نواة من وحدات معالجة الموتّرات بوحدة معالجة المتجهات (VPU) وبحجم 128×128 MXU (وحدة ضرب MatriX). يتم عادةً توصيل "وحدة معالجة الموتّرات" في السحابة الإلكترونية من خلال الشبكة بالجهاز الافتراضي الذي طلبها. وبالتالي، تبدو الصورة الكاملة على النحو التالي:

dfce5522ed644ece.png

رسم توضيحي: جهازك الظاهري مع مسرع "Cloud TPU" المرتبط بالشبكة تتكون "وحدة معالجة الموتّرات في Cloud" نفسها من جهاز افتراضي مزوّد بلوحة TPU متصلة بمنفذ PCI وتحتوي على أربع شرائح TPU ثنائية النواة.

لوحات TPU

يتم ربط وحدات معالجة الموتّرات في مراكز بيانات Google بشبكة حوسبة عالية الأداء (HPC) يمكن أن تجعلها تظهر كمسرّع كبير جدًا. تطلق عليها Google أجهزة pod pods التي يمكن أن تضم ما يصل إلى 512 وحدة معالجة مركزية من TPU الإصدار 2 أو 2048 TPU v3.

2ec1e0d341e7fc34.jpeg

صورة توضيحية: مجموعة TPU v3 يتم توصيل لوحات ورفوف وحدة معالجة الموتّرات من خلال وصلة HPC.

أثناء التدريب، يتم تبادل التدرجات بين نوى TPU باستخدام خوارزمية all-reduce (شرح جيد لخوارزمية all-reduce هنا). يمكن للنموذج الذي يتم تدريبه الاستفادة من الأجهزة عن طريق التدريب على أحجام الدفعات الكبيرة.

d97b9cc5d40fdb1d.gif

صورة توضيحية: مزامنة التدرجات أثناء التدريب باستخدام خوارزمية التقليل على مستوى شبكة HPC ثنائية الأبعاد (TPU) الخاصة بالطاقة الحلقية المتشابكة (TPU) من Google.

البرنامج

تدريب باستخدام حِزم كبيرة

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

في هذا التمرين المعملي عن الترميز، سنستخدم واجهة برمجة تطبيقات Keras. في Keras، تكون الدُفعة التي تحدِّدها هي الحجم العمومي لوحدة معالجة الموتّرات بالكامل. سيتم تقسيم دفعاتك تلقائيًا إلى 8 دفعات وتشغيلها على الوحدات الثماني لوحدة معالجة النطاق الفائق (TPU).

da534407825f01e3.png

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

الجانب الداخلي: XLA

تحدد برامج Tensorflow الرسوم البيانية الحسابية. لا تُشغِّل وحدات معالجة النطاق الفائق (TPU) رمز Python مباشرةً، بل تُشغِّل الرسم البياني الحسابي الذي يحدِّده برنامج Tensorflow. في الخلفية، يحوِّل مُجمِّع يُسمى XLA (مُجمِّع الجبر الخطي المُسرَّع) الرسم البياني Tensorflow لعقد الحوسبة إلى رمز آلي لوحدة معالجة النطاق الفائق (TPU). يُجري هذا المُجمِّع أيضًا العديد من التحسينات المتقدّمة على الرمز البرمجي وتنسيق الذاكرة. ويتمّ التحويل تلقائيًا عند إرسال العمل إلى وحدة معالجة الموتّرات. ليس عليك تضمين XLA في سلسلة الإصدار بشكل صريح.

edce61112cd57972.png

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

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

يمكن استخدام وحدات معالجة النطاق الفائق (TPU) من خلال واجهة برمجة التطبيقات Keras API اعتبارًا من الإصدار 2.1 من Tensorflow. تتوافق تقنية Keras مع وحدات معالجة الموتّرات ووحدات معالجة الموتّرات. في ما يلي مثال يعمل مع وحدات معالجة الموتّرات ووحدات معالجة الرسومات ووحدة المعالجة المركزية(CPU):

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

في مقتطف الرمز هذا:

  • يعثر محرّك البحث TPUClusterResolver().connect() على وحدة معالجة الموتّرات على الشبكة. وتعمل بدون معلَمات على معظم أنظمة Google Cloud (وظائف AI Platform وColloratory وKubeflow والأجهزة الافتراضية للتعلُّم المحسَّن التي تم إنشاؤها من خلال أداة "ctpu up"). وتعرف هذه الأنظمة مكان وحدة TPU بفضل متغيّر البيئة TPU_NAME. في حال إنشاء وحدة TPU يدويًا، يمكنك ضبط متغيّر البيئة TPU_NAME على الجهاز الظاهري الذي تستخدمه، أو استدعاء TPUClusterResolver باستخدام مَعلمات صريحة: TPUClusterResolver(tp_uname, zone, project)
  • TPUStrategy هو الجزء الذي ينفذ توزيع الخوارزمية و"تجميع كل القيم" لمزامنة التدرّج.
  • يتم تطبيق الاستراتيجية من خلال نطاق. يجب تحديد النموذج ضمن نطاق الاستراتيجية().
  • تتوقّع الدالة tpu_model.fit عنصر tf.data.Dataset كمدخل لتدريب TPU.

المهام الشائعة لنقل بيانات وحدة معالجة الموتّرات

  • على الرغم من توفّر العديد من الطرق لتحميل البيانات في نموذج Tensorflow، يجب استخدام واجهة برمجة التطبيقات tf.data.Dataset مع وحدات TPU.
  • وحدات TPU سريعة جدًا، وغالبًا ما تصبح عملية نقل البيانات هي النقطة التي تبطئ الأداء عند تشغيلها. تتوفّر أدوات يمكنك استخدامها لرصد المؤثِّرات السلبية على البيانات ونصائح أخرى بشأن الأداء في دليل أداء TPU.
  • يتم التعامل مع الأرقام int8 أو int16 على أنّها int32. لا تشتمل وحدة معالجة الموتّرات على أجهزة صحيحة تعمل على أقل من 32 بت.
  • بعض عمليات TensorFlow غير متاحة. يمكنك الاطّلاع على القائمة هنا. والخبر السار هو أنّ هذا القيد لا ينطبق إلا على رمز التدريب، أي المرور إلى الأمام والخلف من خلال النموذج. سيظل بإمكانك استخدام جميع عمليات Tensorflow في مسار إدخال البيانات لأنّه سيتم تنفيذها على وحدة المعالجة المركزية.
  • لا يمكن استخدام tf.py_func على TPU.

4. [معلومات] مصنِّف الشبكة العصبونية 101

الملخّص

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

بالنسبة للنماذج المبنية كسلسلة من الطبقات، يوفر 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 ذلك نيابةً عنا. السمة الحسابية للتدرّج هي أنّه يشير "إلى أعلى". وبما أننا نريد أن نتجه إلى حيث يكون القصور المشترك منخفضًا، فإننا نسير في الاتجاه المعاكس. ونقوم بتحديث الأوزان والتحيزات بجزء من التدرج. ثم نكرر الأمر نفسه مرارًا وتكرارًا باستخدام المجموعات التالية من صور التدريب والتصنيفات في حلقة تدريب. نأمل أن يؤدي ذلك إلى تقارب في مكان يكون فيه التشويش المتبادل أدنى حدّ، على الرغم من أنّه ما مِن ما يضمن أنّ هذا الحدّ الأدنى فريد.

خوارزمية انحدار التدرج2.png

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

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

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

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

52e824fe4716c4a0.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5- [INFO] الشبكات العصبية الالتفافية

الملخّص

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

convolutional.gif

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

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

model = tf.keras.Sequential([
  # input: images of size 192x192x3 pixels (the three stands for RGB channels)
  tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
  tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
  tf.keras.layers.Flatten(),
  # classifying into 5 categories
  tf.keras.layers.Dense(5, activation='softmax')
])

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

688858c21e3beff2.png

أساسيات الشبكات العصبية التفافِية

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

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

Screen Shot 2016-07-29 at 16.02.37.png

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

d1b557707bcd1cb9.png

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

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

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

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

2b2d4263bb8470b.gif

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

المُصنِّف التدرّبي

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

4a61aaffb6cba3d1.png

صورة توضيحية: مصنِّف صور يستخدم طبقات التفافية وطبقة softmax. يتم استخدام فلاتر 3×3 و1×1. تأخذ طبقات "التصفية القصوى" الحد الأقصى من مجموعات نقاط البيانات 2×2. يتم تنفيذ رأس التصنيف مع طبقة كثيفة مع تفعيل softmax.

في Keras

يمكن كتابة الحزمة التجميعية للشبكات المُتلافِية الموضّحة أعلاه في Keras على النحو التالي:

model = tf.keras.Sequential([
  # input: images of size 192x192x3 pixels (the three stands for RGB channels)    
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
  tf.keras.layers.Flatten(),
  # classifying into 5 categories
  tf.keras.layers.Dense(5, activation='softmax')
])

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

6- [معلومات جديدة] البُنى الالتفافية الحديثة

باختصار

7968830b57b708c0.png

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

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

l = tf.keras.layers # syntax shortcut

y = l.Conv2D(filters=32, kernel_size=3, padding='same',
             activation='relu', input_shape=[192, 192, 3])(x) # x=input image

# module start: branch out
y1 = l.Conv2D(filters=32, kernel_size=1, padding='same', activation='relu')(y)
y3 = l.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu')(y)
y = l.concatenate([y1, y3]) # output now has 64 channels
# module end: concatenation

# many more layers ...

# Create the model by specifying the input and output tensors.
# Keras layers track their connections automatically so that's all that's needed.
z = l.Dense(5, activation='softmax')(y)
model = tf.keras.Model(x, z)

688858c21e3beff2.png

حيل أخرى بتكلفة منخفضة

فلاتر صغيرة بحجم 3×3

40a7b15fb7dbe75c.png

في هذه الصورة التوضيحية، تظهر نتيجة فلترَين متتاليين بحجم 3×3. حاوِل تتبُّع نقاط البيانات التي ساهمت في النتيجة: يحسب هذان الفلاتر المتتاليان بحجم 3×3 بعض التركيبات لمنطقة 5×5. هذه المجموعة ليست هي نفسها تمامًا التي سيحسبها فلتر 5×5، ولكن من المفيد تجربتها لأنّ فلترَين متتاليين مقاس 3×3 أرخص من فلتر واحد مقاس 5×5.

عمليات الالتفاف 1×1؟

fd7cac16f8ecb423.png

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

7- Squeezenet

تم عرض طريقة بسيطة لدمج هذه الأفكار في مقالة "Squeezenet". يقترح المؤلفون تصميم وحدة تحويلية بسيطة جدًا، باستخدام طبقات تحويلية 1×1 و3×3 فقط.

1730ac375379269b.png

رسم توضيحي: بنية squeezenet المستندة إلى "وحدات النار" وتبدّل هذه الشبكات طبقة 1×1 التي "تضغط" البيانات الواردة في السمة العمودية متبوعة بطبقتَي تحويل منتظمتَين متوازيتَين 1×1 و3×3 "توسّع" عمق البيانات مرة أخرى.

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

استمر في دفتر ملاحظاتك السابق وصمم شبكة عصبية التفافية مستوحاة من الضربة الضغطية. ستحتاج إلى تغيير رمز النموذج إلى "النمط الوظيفي" على طراز Keras.

c3df49e90e5a654f.png Keras_Flowers_TPU (playground).ipynb

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

سيكون من المفيد في هذا التمرين تحديد دالة مساعدة لوحدة squeezenet:

def fire(x, squeeze, expand):
  y = l.Conv2D(filters=squeeze, kernel_size=1, padding='same', activation='relu')(x)
  y1 = l.Conv2D(filters=expand//2, kernel_size=1, padding='same', activation='relu')(y)
  y3 = l.Conv2D(filters=expand//2, kernel_size=3, padding='same', activation='relu')(y)
  return tf.keras.layers.concatenate([y1, y3])

# this is to make it behave similarly to other Keras layers
def fire_module(squeeze, expand):
  return lambda x: fire(x, squeeze, expand)

# usage:
x = l.Input(shape=[192, 192, 3])
y = fire_module(squeeze=24, expand=48)(x) # typically, squeeze is less than expand
y = fire_module(squeeze=32, expand=64)(y)
...
model = tf.keras.Model(x, y)

الهدف هذه المرة هو تحقيق دقة بنسبة %80.

الإجراءات التي يمكنك اتّخاذها

ابدأ بطبقة تلافيفية واحدة، ثمّ اتّبِع ذلك بطبقة "fire_modules"، مع التبديل بين طبقات MaxPooling2D(pool_size=2). يمكنك تجربة ما بين طبقتَين و4 طبقات من طبقات "تجميع الحد الأقصى" في الشبكة، بالإضافة إلى وحدة واحدة أو اثنتين أو ثلاث وحدات متتالية لإطلاق النيران بين طبقات "تجميع الحد الأقصى".

في وحدات إطلاق النار، يجب أن تكون المَعلمة squeeze عادةً أصغر من المَعلمة expand. هذه المَعلمات هي في الواقع أعداد الفلاتر. تتراوح عادةً من 8 إلى 196. يمكنك تجربة البِنى التي يزداد فيها عدد الفلاتر تدريجيًا عبر الشبكة، أو البُنى الأساسية ذات التصميم البسيط التي تحتوي جميع وحدات النار فيها على عدد الفلاتر نفسه.

يُرجى الاطّلاع على المثال أدناه:

x = tf.keras.layers.Input(shape=[*IMAGE_SIZE, 3]) # input is 192x192 pixels RGB

y = tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu')(x)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.GlobalAveragePooling2D()(y)
y = tf.keras.layers.Dense(5, activation='softmax')(y)

model = tf.keras.Model(x, y)

في هذه المرحلة، قد تلاحظ أن تجاربك لا تسير على ما يرام وأن هدف الدقة البالغة 80٪ يبدو بعيد المنال. حان الوقت لبعض الحيل البسيطة الأخرى.

التسوية المجمّعة

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

y = tf.keras.layers.BatchNormalization(momentum=0.9)(y)
# please adapt the input and output "y"s to whatever is appropriate in your context

يجب خفض معلَمة الزخم من قيمتها التلقائية 0.99 إلى 0.9 لأنّ مجموعة البيانات صغيرة. لا عليك الاهتمام بهذه التفاصيل في الوقت الحالي.

زيادة البيانات

سوف تحصل على نقاط مئوية أخرى من خلال زيادة البيانات عن طريق عمليات تحويل سهلة مثل تقلب اليسار واليمين لتغييرات التشبع:

4ed2958e09b487ca.png

ad795b70334e0d6b.png

من السهل جدًا إجراء ذلك في Tensorflow باستخدام واجهة برمجة التطبيقات tf.data.Dataset API. تحديد دالة تحويل جديدة لبياناتك:

def data_augment(image, label):
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_saturation(image, lower=0, upper=2)
    return image, label

بعد ذلك، استخدمها في تحويل البيانات النهائي (مجموعات بيانات التدريب والتحقق من صحة الخلية، الدالة "get_batched_dataset"):

dataset = dataset.repeat() # existing line
# insert this
if augment_data:
  dataset = dataset.map(data_augment, num_parallel_calls=AUTO)
dataset = dataset.shuffle(2048) # existing line

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

من المفترض أن تكون الدقة بنسبة %80 في 35 دورة تدريبية الآن في متناول اليد.

الحلّ

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

c3df49e90e5a654f.png Keras_Flowers_TPU_squeezenet.ipynb

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

  • 😅 طُرز "الأسلوب الوظيفي" من Keras
  • 🤓 بنية Squeezenet
  • 🤓 زيادة البيانات باستخدام tf.data.datset

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

8. Xception المحسَّن

عمليات التفاف يمكن فصلها

ازدادت مؤخرًا شعبية طريقة مختلفة لتنفيذ الطبقات التجميعية، وهي عمليات التجميع القابلة للفصل حسب العمق. أعلم أنّه اسم طويل، ولكنّ المفهوم بسيط جدًا. ويتم تنفيذها في TensorFlow وKeras باسم tf.keras.layers.SeparableConv2D.

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

615720b803bf8dda.gif

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

يتم استخدام الالتفاف القابل للفصل في أحدث بُنى الشبكات الالتفافية: MobileNetV2، وXception، وEfficientNet. بالمناسبة، إنّ MobileNetV2 هو ما استخدمته سابقًا لنقل التعلُّم.

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

الطبقة التلافيفية: 4 × 4 × 3 × 5 = 240

طبقة التفافية قابلة للفصل: 4 x 4 x 3 + 3 x 5 = 48 + 15 = 63

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

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

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

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

الهدف: دقة تزيد عن %95 (نعم، هذا ممكن حقًا)

هذا هو التمرين الأخير، فهو يتطلب المزيد من أعمال البرمجة وعلوم البيانات.

معلومات إضافية عن الضبط

تتوفّر شركة Xception ضمن النماذج العادية المدرّبة مسبقًا في tf.keras.application.* لا تنس ترك جميع الأوزان قابلة للتدريب هذه المرة.

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

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

9b1af213b2b36d47.png

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

في Keras، يتم تحديد معدل التعلم من خلال استدعاء يمكنك من خلاله حساب معدل التعلم المناسب لكل حقبة. ستُرسِل Keras معدّل التعلّم الصحيح إلى أداة التحسين لكل دورة تدريبية.

def lr_fn(epoch):
  lr = ...
  return lr

lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_fn, verbose=True)

model.fit(..., callbacks=[lr_callback])

الحلّ

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

c3df49e90e5a654f.png 07_Keras_Flowers_TPU_xception_fine_tuned_best.ipynb

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

  • ويحتوي على ميزة الالتفاف القابل للفصل بين العمق
  • 🤓 الجداول الزمنية لمعدّل التعلّم
  • 😈 تحسين نموذج مدرَّب مسبقًا

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

9. تهانينا!

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

استخدام وحدات معالجة الموتّرات في التطبيقات

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

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

HR.png

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

tensorflow logo.jpg
www.tensorflow.org