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

1. نظرة عامة

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

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

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

ca8cc21f6838eccc.png

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

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

الملاحظات

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

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

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

688858c21e3beff2.png

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

c3df49e90e5a654f.png Welcome to Colab.ipynb

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

8832c6208c99687d.png

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

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

76d05caa8b4db6da.png

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

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

429f106990037ec4.png

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

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

edc3dba45d26f12a.png

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

المصادقة

cdd4b41413100543.png

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

3- [INFO] ما هي وحدات معالجة الموتّرات (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

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

f1b283fc45966717.gif

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

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

Cloud TPU

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

dfce5522ed644ece.png

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

حِزم وحدات معالجة الموتّرات

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

2ec1e0d341e7fc34.jpeg

صورة توضيحية: مجموعة من وحدات TPU v3. لوحات ووحدات TPU متصلة من خلال شبكة ربط بينية للحوسبة عالية الأداء

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

d97b9cc5d40fdb1d.gif

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

البرنامج

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

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

في هذا الدرس العملي، سنستخدم Keras API. في Keras، الدفعة التي تحدّدها هي حجم الدفعة العام لوحدة معالجة Tensor Processing Unit بأكملها. سيتم تقسيم الدفعات تلقائيًا إلى 8 أجزاء وتشغيلها على 8 نوى في وحدة معالجة Tensor.

da534407825f01e3.png

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

الخيارات المتقدّمة: XLA

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

edce61112cd57972.png

توضيح: لتشغيل الرسم البياني للحساب الذي يحدّده برنامج TensorFlow على وحدة معالجة الموتّرات، يتم أولاً تحويله إلى تمثيل XLA (مترجم الجبر الخطي المسرَّع)، ثم يتم تجميعه بواسطة XLA في لغة آلة وحدة معالجة الموتّرات.

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

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

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 وColaboratory وKubeflow وDeep Learning VMs التي تم إنشاؤها من خلال الأداة المساعدة "ctpu up"). تعرف هذه الأنظمة مكان وحدة معالجة الموتّرات بفضل متغيّر البيئة TPU_NAME. إذا أنشأت وحدة TPU يدويًا، يمكنك إما ضبط متغير البيئة TPU_NAME على الجهاز الافتراضي الذي تستخدمه منه، أو استدعاء TPUClusterResolver باستخدام مَعلمات صريحة: TPUClusterResolver(tp_uname, zone, project)
  • TPUStrategy هو الجزء الذي ينفّذ التوزيع وخوارزمية مزامنة التدرّج "all-reduce".
  • يتم تطبيق الاستراتيجية من خلال نطاق. يجب تحديد النموذج ضمن نطاق الاستراتيجية()
  • تتوقّع الدالة tpu_model.fit إدخال عنصر tf.data.Dataset للتدريب على وحدات TPU.

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

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

4. [INFO] مقدّمة عن مصنّف الشبكة العصبونية

باختصار

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

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

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

الخلايا العصبية والتنشيط ووظيفة 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 صورة مثلاً يعطي تدرّجًا يمثّل القيود التي تفرضها صور الأمثلة المختلفة بشكل أفضل، وبالتالي من المرجّح أن يتقارب مع الحلّ بشكل أسرع. حجم الدفعة الصغيرة هو مَعلمة قابلة للتعديل.

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

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

52e824fe4716c4a0.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- [INFO] الشبكات العصبونية الالتفافية

باختصار

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

convolutional.gif

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

إليك الشكل الذي تبدو عليه شبكة عصبونية التفافية بسيطة في 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

الدليل الإرشادي للشبكات العصبونية الالتفافية

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

4a61aaffb6cba3d1.png

صورة توضيحية: مصنّف صور يستخدم طبقات التفافية وطبقات softmax يستخدم فلاتر 3x3 و1x1. تأخذ طبقات maxpool الحد الأقصى لمجموعات من نقاط البيانات 2x2. يتم تنفيذ رأس التصنيف باستخدام طبقة كثيفة مع تنشيط 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

صورة توضيحية: "وحدة" التفافية ما هو الأفضل في هذه المرحلة؟ طبقة تجميع الحد الأقصى متبوعة بطبقة التفافية 1x1 أو مجموعة مختلفة من الطبقات؟ جرِّبها كلها، ثم ادمج النتائج ودَع الشبكة تحدّد النتيجة. على اليسار: بنية الالتفاف " 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

الحيل الرخيصة الأخرى

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

40a7b15fb7dbe75c.png

في هذا الرسم التوضيحي، يمكنك الاطّلاع على نتيجة فلترَين متتاليَين بحجم 3x3. حاوِل تتبُّع نقاط البيانات التي ساهمت في النتيجة، لأنّ هذين الفلترَين المتتاليَين بحجم 3x3 يحسبان بعض المجموعات من منطقة بحجم 5x5. وهي ليست التركيبة نفسها التي يحسبها فلتر 5x5، ولكن يجدر تجربتها لأنّ فلترَين متتاليَين 3x3 أقل تكلفة من فلتر واحد 5x5.

1x1 convolutions ?

fd7cac16f8ecb423.png

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

7. Squeezenet

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

1730ac375379269b.png

صورة توضيحية: بنية SqueezeNet المستندة إلى "وحدات إطلاق النار". تتبادل هذه الطبقات طبقة 1x1 "تضغط" البيانات الواردة في البُعد العمودي، تليها طبقتان متوازيتان من الطبقات الالتفافية 1x1 و3x3 "توسّعان" عمق البيانات مرة أخرى.

التجربة العملية

تابِع في دفتر الملاحظات السابق وأنشئ شبكة عصبونية التفافية مستوحاة من Squeezenet. عليك تغيير رمز النموذج إلى "الأسلوب الوظيفي" في 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 طبقات تجميع أقصى في الشبكة، وكذلك استخدام وحدة Fire واحدة أو اثنتَين أو ثلاث وحدات متتالية بين طبقات التجميع الأقصى.

في وحدات إطلاق النار، يجب أن تكون المَعلمة "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. حدِّد دالة تحويل جديدة لبياناتك:

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 حقبة.

Solution

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

c3df49e90e5a654f.png Keras_Flowers_TPU_squeezenet.ipynb

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

  • 🤔 نماذج "الأسلوب الوظيفي" في Keras
  • ‫🤓 بنية Squeezenet
  • 🤓 زيادة البيانات باستخدام tf.data.datset

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

8. Xception fine-tuned

الالتفافات القابلة للفصل

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

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

615720b803bf8dda.gif

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

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

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

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

الطبقة التفافية القابلة للفصل: 4 × 4 × 3 + 3 × 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])

Solution

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

c3df49e90e5a654f.png 07_Keras_Flowers_TPU_xception_fine_tuned_best.ipynb

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

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

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

9- تهانينا!

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

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

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

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

HR.png

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

tensorflow logo.jpg
www.tensorflow.org