إنشاء شبكات عصبونية التفافية (CNNs) لتحسين الرؤية الحاسوبية

1. قبل البدء

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

المتطلبات الأساسية

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

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

  • كيفية تحسين رؤية الكمبيوتر ودقته باستخدام الالتفافات

العناصر التي سيتم إنشاؤها

  • طبقات لتحسين الشبكة العصبونية

المتطلبات اللازمة

يمكنك العثور على الرمز لبقية الدرس التطبيقي حول الترميز قيد التشغيل في Colab.

ويجب أيضًا تثبيت TensorFlow والمكتبات التي ثبّتها في الدرس التطبيقي السابق.

2. تحسين دقة الرؤية على الكمبيوتر باستخدام الالتفافات

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

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

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))

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

إذا كنت قد أكملت معالجة الصور باستخدام فلتر، ستبدو الخلطات مألوفة جدًا.

باختصار، يمكنك التقاط مصفوفة (عادةً 3x3 أو 5x5) وتمريرها فوق الصورة. من خلال تغيير وحدات البكسل الأساسية استنادًا إلى الصيغة داخل تلك المصفوفة، يمكنك إجراء عمليات مثل الكشف عن الحافة. على سبيل المثال، يتم تحديد 3x3 عادةً لاكتشاف الحافة حيث تكون الخلية الوسطى 8، وجميع جيرانها -1. في هذه الحالة، يمكنك ضرب قيمة كل وحدة بكسل في 8، ثم طرح قيمة كلّ جيران. افعل ذلك لكل بكسل، وستحصل على صورة جديدة تم تحسين حوافها.

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

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

3- جرِّب الرمز.

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

import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images / 255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy*100))

ومن المحتمل أن تصل النسبة إلى 93% تقريبًا في بيانات التدريب و91% في بيانات التحقّق.

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

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

استعرِض الرمز مرة أخرى، واطّلِع على طريقة إنشاء التركيبات خطوة بخطوة.

4. جمع البيانات

تتمثل الخطوة الأولى في جمع البيانات.

ستلاحظ وجود تغيير هنا ويجب تغيير بيانات التدريب. ويرجع ذلك إلى أن الالتفاف الأول يتوقع موتِّرًا واحدًا يحتوي على كل العناصر، لذا فبدلاً من 60,000 عنصر 28x28x1 في قائمة، تكون لديك قائمة 4D واحدة بحجم 60,000x28x28x1، وكذلك منها للصور التجريبية. إذا لم تنفِّذ هذا الإجراء، سيظهر لك خطأ عند التدريب لأنّ التواءات لا تتعرّف على الشكل.

import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images = training_images/255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images = test_images/255.0

5. تعريف النموذج

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

  • عدد التركيبات التي تريد إنشاءها. وتُعدّ القيمة، مثل 32، نقطة بداية جيدة.
  • حجم المصفوفة الملتوية، في هذه الحالة شبكة 3x3.
  • دالة التفعيل المراد استخدامها، في هذه الحالة، استخدم relu.
  • في الطبقة الأولى، شكل بيانات الإدخال

عليك مواكبة الالتفاف باستخدام طبقة تجميع كبيرة تم تصميمها لضغط الصورة مع الاحتفاظ بمحتوى الميزات التي تم تمييزها من خلال الالتفاف. وعند تحديد (2,2) للحد الأقصى للتجميع، يكون التأثير هو تقليل حجم الصورة بمقدار 4. فهو ينشئ مصفوفة بوحدات البكسل 2x2 ويختار أكبر قيمة بكسل، ليحول 4 بكسل إلى 1. ويؤدي هذا إلى تكرار هذه العملية الحسابية عبر الصورة، ويؤدي ذلك إلى نصف عدد وحدات البكسل الأفقية ونصف عدد وحدات البكسل الرأسية.

يمكنك الاتصال بـ model.summary() للاطّلاع على حجم الشبكة وشكلها. يُرجى ملاحظة أنّه بعد كل طبقة من حدود التجميع، يتم تقليل حجم الصورة بالطريقة التالية:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_2 (Conv2D)            (None, 26, 26, 64)        640       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 13, 13, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 11, 11, 64)        36928     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 1600)              0         
_________________________________________________________________
dense_4 (Dense)              (None, 128)               204928    
_________________________________________________________________
dense_5 (Dense)              (None, 10)                1290      
=================================================================

هَا هُوَ الرَّمْزُ الْكَامِلْ لِـ CNN:

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2, 2),
#Add another convolution
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
#Now flatten the output. After this you'll just have the same DNN structure as the non convolutional version
tf.keras.layers.Flatten(),
#The same 128 dense layers, and 10 output layers as in the pre-convolution example:
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])

6- تجميع النموذج وتدريبه

جمّع النموذج، واستدعِ طريقة الممارسة لتنفيذ التدريب، وقيِّم الخسارة والدقة من مجموعة الاختبار.

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print ('Test loss: {}, Test accuracy: {}'.format(test_loss, test_acc*100))

7- أنشئ تمثيلات بصرية للالتفافات وتجميعها

ويوضّح لك هذا الرمز الرسمة انحرافات في الشكل. تعرض print (test_labels[:100]) أول 100 تصنيف في مجموعة الاختبار، ويمكنك ملاحظة أن التصنيفات في الفهرس 0 والفهرس 23 والفهرس 28 هي القيمة نفسها (9). لا مشكلة في الأحذية. ألق نظرة على نتيجة تشغيل الالتفاف على كل منها وستبدأ في رؤية الميزات الشائعة بينها. والآن، عندما يتم تدريب DNN على هذه البيانات، فإنها تعمل على تقليل المعلومات، وقد يكون مشتركًا بين الأحذية بناءً على تركيبة التركيب والتجميع هذه.

print(test_labels[:100])
[9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 4 8 0 2 5 7 9 1 4 6 0 9 3 8 8 3 3 8 0 7
 5 7 9 6 1 3 7 6 7 2 1 2 2 4 4 5 8 2 2 8 4 8 0 7 7 8 5 1 1 2 3 9 8 7 0 2 6
 2 3 1 2 8 4 1 8 5 9 5 0 3 2 0 6 5 3 6 7 1 8 0 1 4 2]

ويمكنك الآن اختيار بعض الصور المقابلة لهذه التصنيفات وعرض الشكل الذي تبدو عليه خلال التطابقات. وبالتالي، في الرمز التالي، FIRST_IMAGE وSECOND_IMAGE وTHIRD_IMAGE هي كل فهارس القيمة 9، وهي أحذية الكاحل.

import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=23
THIRD_IMAGE=28
CONVOLUTION_NUMBER = 6
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
  f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[0,x].grid(False)
  f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[1,x].grid(False)
  f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[2,x].grid(False)

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

6c9109bcc640a1ec.png

8- تدريبات

التمرين 1

حاوِل تعديل التطابقات. غيِّر عدد التعقيدات من 32 إلى 16 أو 64. ما تأثير ذلك على الدقة والتدريب؟

التمرين 2

أزِل الالتفاف النهائي. ما تأثير ذلك على الدقة أو وقت التدريب؟

التمرين 3

أضِف مزيد من الانحرافات. ما تأثير ذلك؟

التمرين 4

أزِل كل التركيبات باستثناء النص الأول. ما تأثير ذلك؟ ننصحك بتجربة هذه الميزة.

9- تهانينا

لقد أنشأت قناة CNN الأولى للتعرّف على كيفية تحسين نماذج الرؤية الحاسوبية بصورةٍ أكبر، يُرجى المتابعة إلى استخدام الشبكات العصبونية الالتفافية (CNNs) مع الصور المعقدة.