تصنيف صور CNN في TensorFlow مع الخطوات والأمثلة

⚡ ملخص ذكي

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

  • 🔘 أربعة مكونات: تتضمن كل شبكة عصبية التفافية (convnet) طبقات الالتفاف، واللاخطية ReLU، والتجميع، وطبقة تصنيف متصلة بالكامل.
  • ☑️ آليات الالتفاف: يتم تمرير مرشح 3×3 أو 5×5 عبر الصورة، ويتم بناء خريطة الميزات من خلال الضرب العنصري.
  • ✅ ثلاثة عناصر تحكم: يحدد العمق عدد المرشحات، وتحدد الخطوة القفزة بين النوافذ، ويحافظ الحشو الصفري على بُعد الإخراج.
  • 🧪 Poolinتأثير g: تجميع البيانات القصوى باستخدام نافذة 2×2 وخطوة 2 نصف لكل محور، مما يقلل الأوزان ويحد من الإفراط في التخصيص.
  • 🛠️ سبع خطوات بناء: قم بتحميل مجموعة البيانات، ثم حدد طبقات الإدخال، والالتفاف، والتجميع، والالتفاف الثاني، والطبقات الكثيفة، واللوغاريتمات.
  • 📈 النتيجة المقاسة: تشير التقارير التي تم تقييمها إلى دقة 0.9689286 على MNIST، متجاوزة نسبة 96% التي حققتها الشبكة العصبية البسيطة.

تصنيف الصور باستخدام الشبكات العصبية التلافيفية في TensorFlow

ما هي الشبكة العصبية التلافيفية؟

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

Archiبنية الشبكة العصبية التلافيفية

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

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

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

بنية الشبكة العصبية الالتفافية المتكاملة من الصورة المدخلة مروراً بمراحل الالتفاف وصولاً إلى الرقم المتوقع
Archiبنية الشبكة العصبية التلافيفية (CNN)

تتكون الصورة من مصفوفة من البكسلات ذات ارتفاع وعرض. تحتوي الصورة الرمادية على قناة واحدة فقط، بينما تحتوي الصورة الملونة على ثلاث قنوات (واحدة للأحمر، وواحدة للأخضر، وواحدة للأزرق). تتراص هذه القنوات فوق بعضها. في هذا الدرس، ستستخدم صورة رمادية ذات قناة واحدة فقط. لكل بكسل قيمة تتراوح بين 0 و255 لتعكس شدة اللون. على سبيل المثال، البكسل الذي قيمته 0 يُظهر اللون الأبيض، بينما البكسل الذي قيمته قريبة من 255 يُظهر اللون الداكن.

دعونا نلقي نظرة على الصورة المخزنة في مجموعة بيانات MNISTتوضح الصورة أدناه كيفية تمثيل الصورة الموجودة على اليسار في شكل مصفوفة. لاحظ أن المصفوفة الأصلية قد تم توحيد قيمها لتكون بين 0 و1. بالنسبة للألوان الداكنة، تبلغ القيمة في المصفوفة حوالي 0.9، بينما تبلغ قيمة البكسلات البيضاء 0.

رقم MNIST مكتوب بخط اليد معروض بجانب مصفوفة البكسل الخاصة به المكونة من 28 × 28 بكسل، مع قيم موحدة بين 0 و1

عملية التفافية

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

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

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

مكونات الشبكة العصبية التلافيفية (ConvNet أو CNN)

تتكون الشبكة العصبية الالتفافية من أربعة مكونات:

  1. التفاف
  2. غير الخطية (ReLU)
  3. Poolinز أو أخذ العينات الفرعية
  4. التصنيف (طبقة متصلة بالكامل)

التفاف

الغرض من عملية الالتفاف هو الـtracتعتمد هذه التقنية على خصائص الكائن في الصورة محليًا. وهذا يعني أن الشبكة ستتعلم أنماطًا محددة داخل الصورة وستكون قادرة على التعرف عليها في كل مكان فيها.

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

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

الضرب العنصري لرقعة صورة بحجم 3×3 مع مرشح ينتج عنه قيمة واحدة لخريطة الميزات

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

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

تتوفر العديد من المرشحات. فيما يلي قائمة ببعضها. ستلاحظ أن لكل مرشح غرضًا محددًا. لاحظ أن مصطلح "النواة" في الصورة أدناه هو مرادف لكلمة "مرشح".

جدول يوضح أنواع النوى الالتفافية الشائعة مثل كشف الحواف، والتوضيح، والتشويش، مع صور الإخراج الناتجة عنها.

الحساب وراء الإلتواء

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

عرض توضيحي خطوة بخطوة لمرشح 3×3 يقوم بضرب قيم الصورة وجمعها في مصفوفة الإخراج

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

تأثير الحدود

تحتوي الصورة على خريطة ميزات بحجم 5×5 وفلتر بحجم 3×3. توجد نافذة واحدة فقط في المركز حيث يمكن للفلتر تصفية شبكة بحجم 3×3. تتقلص خريطة الميزات الناتجة بمقدار مربعين على كل محور، لتصبح أبعادها 3×3.

تم تقليص خريطة الميزات 5×5 إلى مخرج 3×3 لأن مرشح 3×3 لا يستطيع الوصول إلى الحدود

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

مدخل بحجم 5×5 محاط بحلقة من الحشو الصفري بحيث تُرجع عملية الالتفاف مخرجًا بحجم 5×5

عند تحديد الشبكة، يتم التحكم في الميزات المجمعة بواسطة ثلاث معلمات:

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

ثلاث مرشحات منفصلة تقوم بدمج نفس المدخلات وتنتج ثلاث خرائط ميزات مكدسة

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

مثال الخطوة 1

نافذة التصفية تتحرك بكسلًا واحدًا في كل مرة عبر صف الإدخال مع ضبط الخطوة على 1

الخطوة 2

تخطي نافذة التصفيةping مسافة بكسلين بين المواضع مع ضبط الخطوة على 2، مما ينتج عنه مخرج أقصر

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

غير الخطية (ReLU)

في نهاية عملية الالتفاف، تُطبَّق دالة تنشيط على الناتج للسماح باللاخطية. دالة التنشيط الشائعة في الشبكات العصبية الالتفافية هي ReLU. تُستبدل جميع البكسلات ذات القيمة السالبة بالصفر.

Pooling Operaالإنتاج

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

في هذه المرحلة، عليك تحديد الحجم والخطوة. إحدى الطرق الشائعة لتجميع الصورة المدخلة هي استخدام القيمة القصوى لخريطة الميزات. انظر إلى الصورة أدناه. سيقوم التجميع بفحص أربع مصفوفات فرعية من خريطة الميزات 4×4 وإرجاع القيمة القصوى. يأخذ التجميع القيمة القصوى لمصفوفة 2×2 ثم يحرك هذه النافذة بمقدار بكسلين. على سبيل المثال، المصفوفة الفرعية الأولى هي [3,1,3,2]، لذا سيرجع التجميع القيمة القصوى، وهي 3.

خريطة ميزات بحجم 4×4 تم تقليصها إلى مخرج بحجم 2×2 باستخدام تجميع أقصى مع نافذة بحجم 2×2 وخطوة 2

هناك عملية تجميع أخرى مثل المتوسط.

تعمل هذه العملية على تقليل حجم خريطة المعالم بشكل كبير.

طبقات متصلة بالكامل

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

خلاصة:

تقوم الشبكة العصبية الالتفافية في TensorFlow بتجميع طبقات مختلفة قبل إجراء التنبؤ. تتكون الشبكة العصبية مما يلي:

  • طبقة تلافيفية
  • وظيفة تنشيط ReLU
  • Poolinطبقة ز
  • طبقة متصلة بكثافة

تُطبّق الطبقات الالتفافية مرشحات مختلفة على منطقة فرعية من الصورة. وتُضيف دالة التنشيط ReLU خاصية اللاخطية، بينما تُقلّل طبقات التجميع من أبعاد خرائط الميزات.

كل هذه الطبقات مثالtracتُستخلص المعلومات الأساسية من الصور. وأخيرًا، تُغذى خرائط الميزات إلى طبقة متصلة بالكامل مع دالة softmax لإجراء التنبؤ.

تدريب CNN مع TensorFlow

الآن وقد أصبحت على دراية بمكونات الشبكة العصبية الالتفافية، فأنت جاهز لبناء واحدة باستخدام TensorFlow. سوف نستخدم مجموعة بيانات MNIST لتصنيف صور CNN.

إن إعداد البيانات هو نفس ما تم في البرنامج التعليمي السابق. يمكنك تشغيل التعليمات البرمجية والانتقال مباشرة إلى بنية CNN.

ستتبع الخطوات أدناه لتصنيف الصور باستخدام CNN:

  1. الخطوة 1: تحميل مجموعة البيانات
  2. الخطوة 2: طبقة الإدخال
  3. الخطوة 3: الطبقة التلافيفية
  4. الخطوة 4 : Poolinطبقة ز
  5. الخطوة 5: الطبقة التلافيفية الثانية و Poolinطبقة ز
  6. الخطوة 6: طبقة كثيفة
  7. الخطوة 7: طبقة السجل

ملاحظة حول الإصدار: تستهدف القوائم أدناه TensorFlow 1.x. في TensorFlow 2، لم يعد اسم النطاق tf.layers و tf.estimator.inputs.numpy_input_fn موجودين؛ المكافئ لهما هو tf.keras.layers.Conv2D و MaxPoolinتم تجميع طبقات g2D وDense وDropout في نموذج tf.keras.Model وتدريبها باستخدام model.fit(). اقرأ خطوات عمل كل طبقة، ثم قم بتطبيقها على واجهة برمجة تطبيقات Keras.

الخطوة 1: تحميل مجموعة البيانات

تتوفر مجموعة بيانات MNIST عبر مكتبة scikit-learn. يرجى تنزيلها وحفظها في مجلد التنزيلات. يمكنك تحميلها باستخدام الأمر fetch_mldata('MNIST original').

ملاحظة حول الإصدار: تم إغلاق موقع mldata.org، وتمت إزالة دالة fetch_mldata() في مكتبة scikit-learn الإصدار 0.22. في أي تثبيت حالي، قم بتحميل نفس الأرقام باستخدام جلب_مل_أو_مل بدلاً من ذلك، يتم استخدام fetch_openml('mnist_784', version=1). أما باقي مسار المعالجة فيبقى دون تغيير.

قم بإنشاء مجموعة تدريب/اختبار

يجب عليك تقسيم مجموعة البيانات باستخدام train_test_split.

مقياس الميزات

وأخيرًا، يمكنك تغيير حجم الميزات باستخدام MinMaxScaler كما هو موضح في مثال تصنيف الصور أدناه باستخدام TensorFlow CNN.

import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_mldata

#Change USERNAME by the username of your machine
## Windows USER
mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')
## Mac User
mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')

print(mnist.data.shape)
print(mnist.target.shape)
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )
## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
X_train_scaled.shape[1:]

تعريف سي ان ان

تستخدم الشبكة العصبية التلافيفية (CNN) مرشحات على وحدات البكسل الخام للصورة لتعلم أنماط تفصيلية مقارنةً بالأنماط العامة التي تتعلمها الشبكة العصبية التقليدية. لبناء شبكة عصبية تلافيفية، عليك تحديد ما يلي:

  1. طبقة الالتفاف: يتم تطبيق عدد n من المرشحات على خريطة الميزات. بعد الالتفاف، يجب استخدام دالة التنشيط ReLU لإضافة اللاخطية إلى الشبكة.
  2. Poolinطبقة g: الخطوة التالية بعد عملية الالتفاف هي تقليل أبعاد خريطة الميزات. والهدف من ذلك هو تقليل أبعاد خريطة الميزات لمنع التجاوز وتحسين سرعة الحساب. التجميع الأقصى هو الأسلوب التقليدي، حيث يقسم خرائط الميزات إلى مناطق فرعية (عادةً بحجم 2×2) ويحتفظ فقط بالقيم القصوى.
  3. الطبقات المتصلة بالكامل: جميع الخلايا العصبية من الطبقات السابقة متصلة بالطبقات التالية. ستقوم CNN بتصنيف العلامة وفقًا للميزات من الطبقات المتعرجة والمختزلة باستخدام طبقة التجميع.

هندسة CNN

  • الطبقة الالتفافية: تطبق 14 مرشحًا بحجم 5×5 (مثال:trac(مناطق فرعية بحجم 5×5 بكسل)، باستخدام دالة التنشيط ReLU
  • Pooling Layer: تقوم بتنفيذ أقصى قدر من التجميع باستخدام مرشح 2×2 وخطوة 2 (التي تحدد أن المناطق المجمعة لا تتداخل)
  • الطبقة التلافيفية: تطبق 36 مرشحًا 5×5، مع وظيفة تنشيط ReLU
  • Pooling الطبقة رقم 2: مرة أخرى، تقوم بتنفيذ أقصى تجميع باستخدام مرشح 2×2 وخطوة 2
  • 1,764 خلية عصبية، مع معدل تنظيم التسرب يبلغ 0.4 (احتمال 0.4 أن يتم إسقاط أي عنصر معين أثناء التدريب)
  • الطبقة الكثيفة (طبقة اللوجيستات): 10 خلايا عصبية، واحدة لكل فئة مستهدفة من الأرقام (0-9).

هناك ثلاث وحدات مهمة يمكن استخدامها لإنشاء CNN:

  • conv2d(). إنشاء طبقة تلافيفية ثنائية الأبعاد تحتوي على عدد المرشحات وحجم نواة المرشح والحشو ووظيفة التنشيط كوسيطات.
  • max_pooling2d(). يقوم بإنشاء طبقة تجميع ثنائية الأبعاد باستخدام خوارزمية التجميع الأقصى.
  • كثيف(). يبني طبقة كثيفة بالطبقات والوحدات المخفية

ستقوم بتعريف دالة لبناء الشبكة العصبية التلافيفية (CNN). دعونا نرى بالتفصيل كيفية بناء كل لبنة من لبنات البناء قبل الانتقال إلى مرحلة التغليف.ping كل شيء معًا في الدالة.

الخطوة 2: طبقة الإدخال

def cnn_model_fn(features, labels, mode):
    input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

تحتاج إلى تحديد موتر مع شكل البيانات. لذلك، يمكنك استخدام الوحدة tf.reshape. في هذه الوحدة، عليك أن تعلن عن إعادة تشكيل الموتر وشكل الموتر. الوسيطة الأولى هي ميزات البيانات، والتي تم تعريفها في وسيطة الوظيفة.

تتكون الصورة من ارتفاع وعرض وقناة. مجموعة بيانات MNIST عبارة عن صورة أحادية اللون بحجم 28×28. نضبط حجم الدفعة على -1 في وسيط الشكل بحيث يأخذ شكل الميزات["x"]. تكمن الميزة في جعل حجم الدفعة مُعاملًا فائقًا قابلًا للضبط. إذا تم ضبط حجم الدفعة على 7، فسيُدخل الموتر 5,488 قيمة (28×28×7).

الخطوة 3: الطبقة التلافيفية

# first Convolutional Layer
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=14,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

تحتوي الطبقة الالتفافية الأولى على 14 مرشحًا بحجم نواة 5×5 مع نفس الحشو. يعني تساوي الحشو أن يكون لكل من موتر الإخراج وموتر الإدخال نفس الارتفاع والعرض. سيضيف TensorFlow أصفارًا إلى الصفوف والأعمدة لضمان تساوي الحجم.

تستخدم دالة التنشيط ReLU. سيكون حجم الإخراج [28، 28، 14].

الخطوة 4 : Poolinطبقة ز

الخطوة التالية بعد عملية الالتفاف هي عملية التجميع. تعمل عملية التجميع على تقليل أبعاد البيانات. يمكنك استخدام وحدة max_pooling2d بحجم 2×2 وخطوة 2. استخدم الطبقة السابقة كمدخل. سيكون حجم المخرج [batch_size, 14, 14, 14].

# first Pooling Layer 
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

الخطوة 5: الطبقة التلافيفية الثانية و Poolinطبقة ز

تُطبّق الطبقة الالتفافية الثانية 36 مرشحًا، مما يُنتج حجمًا للإخراج [batch_size, 14, 14, 36]. تستخدم طبقة التجميع نفس النافذة 2×2 والخطوة 2 كما في السابق، لذا فهي تُقسّم كل محور مكاني إلى النصف، ويصبح شكل الإخراج [batch_size, 7, 7, 36].

conv2 = tf.layers.conv2d(
      inputs=pool1,
      filters=36,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

الخطوة 6: طبقة كثيفة

بعد ذلك، عليك تحديد الطبقة المتصلة بالكامل. يجب تسوية خريطة المعالم قبل ربطها بالطبقة الكثيفة. يمكنك استخدام وحدة إعادة التشكيل بحجم 7×7×36.

ستربط الطبقة الكثيفة 1,764 عصبونًا. أضف دالة التنشيط ReLU. بالإضافة إلى ذلك، أضف حد تنظيم التسرب بمعدل 0.3، ما يعني أن 30% من التنشيطات ستُضبط على الصفر. لاحظ أن التسرب يحدث فقط خلال مرحلة التدريب. تحتوي الدالة cnn_model_fn على وسيط mode لتحديد ما إذا كان النموذج بحاجة إلى التدريب أو التقييم، كما هو موضح في مثال تصنيف الصور باستخدام شبكة عصبية تلافيفية (CNN) في TensorFlow أدناه.

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])

dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
      inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

الخطوة 7: طبقة السجل

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

# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)

يمكنك إنشاء قاموس يحتوي على الفئات واحتمالية كل فئة. تُعيد الدالة tf.argmax() فهرس أعلى قيمة في طبقة اللوجيت. تُعيد الدالة softmax احتمالية كل فئة.

predictions = {				
	# Generate predictions				
    "classes": tf.argmax(input=logits, axis=1),				
    "probabilities": tf.nn.softmax(logits, name="softmax_tensor")  }			

تريد فقط إرجاع قاموس التنبؤات عندما يكون الوضع مضبوطًا على التنبؤ. أضف هذا الكود لعرض التنبؤات.

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

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

# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

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

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())

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

eval_metric_ops = {
      "accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

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

def cnn_model_fn(features, labels, mode):
  """Model function for CNN."""
  # Input Layer
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])

  # Convolutional Layer
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=32,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

  # Pooling Layer
  pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

  # Convolutional Layer #2 and Pooling Layer
  conv2 = tf.layers.conv2d(
      inputs=pool1,
      filters=36,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)
  pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

  # Dense Layer
  pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
  dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
  dropout = tf.layers.dropout(
      inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

  # Logits Layer
  logits = tf.layers.dense(inputs=dropout, units=10)

  predictions = {
      # Generate predictions (for PREDICT and EVAL mode)
      "classes": tf.argmax(input=logits, axis=1),
      "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
  }

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  # Calculate Loss
  loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

  # Configure the Training Op (for TRAIN mode)
  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

  # Add evaluation metrics Evaluation mode
  eval_metric_ops = {
      "accuracy": tf.metrics.accuracy(
          labels=labels, predictions=predictions["classes"])}
  return tf.estimator.EstimatorSpec(
      mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

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

الخطوات أدناه هي نفس الدروس السابقة.

أولاً، عليك تحديد مُقدِّر باستخدام نموذج CNN لتصنيف الصور.

# Create the Estimator
mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

يستغرق تدريب الشبكة العصبية التلافيفية وقتًا طويلاً، لذلك، تقوم بإنشاء خطاف تسجيل لتخزين قيم طبقات softmax كل 50 تكرارًا.

# Set up logging for predictions
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

أنت الآن جاهز لتقدير النموذج. حدد حجم الدفعة بـ 100 وقم بخلط البيانات. لاحظ أننا حددنا خطوات التدريب بـ 16,000، مما قد يستغرق وقتًا طويلاً للتدريب. تحلَّ بالصبر.

# Train the model
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=100,
    num_epochs=None,
    shuffle=True)
mnist_classifier.train(
    input_fn=train_input_fn,
    steps=16000,
    hooks=[logging_hook])

الآن بعد أن تم تدريب النموذج، يمكنك تقييمه وطباعة النتائج.

# Evaluate the model and print results
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test,
    num_epochs=1,
    shuffle=False)
eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)
print(eval_results)

يقوم التقييم بطباعة نقطة التفتيش المستعادة، والخطوة التي توقف عندها، وقاموس المقاييس النهائي.

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56
INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269
{'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}

باستخدام البنية الحالية، يُظهر قاموس التقييم دقة تبلغ 0.9689286، أي ما يقارب 97%. يمكنك تغيير البنية وحجم الدفعة وعدد التكرارات لتحسين الدقة. وقد تفوقت الشبكة العصبية التلافيفية (CNN) بشكل ملحوظ على... شبكة اعصاب صناعية أو الانحدار اللوجستي: في الدرس التعليمي حول الشبكات العصبية الاصطناعية، بلغت دقة النموذج 96%، وهي أقل من دقة الشبكة العصبية التلافيفية (CNN). يُظهر أداء الشبكة العصبية التلافيفية (CNN) أداءً مذهلاً مع مجموعات الصور الأكبر، سواءً من حيث سرعة الحساب أو الدقة.

الأسئلة الشائعة

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

لم يتم التغيير. تمت إزالة tf.layers و tf.estimator.inputs.numpy_input_fn. أعد بناء نفس البنية باستخدام tf.keras.layers.Conv2D، MaxPooling2D، الكثافة والتسرب داخل TensorFlow قم بتدريب نموذج Keras باستخدام model.fit() بدلاً من Estimator.

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

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

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

تستخدم هذه العملية 16,000 خطوة بحجم دفعة 100. يتحقق معظم الدقة في وقت مبكر، لذا راقب مقياس التقييم وتوقف بمجرد أن يستقر بدلاً من انتظار العد الكامل على جهاز بطيء.

تم إغلاق موقع mldata.org، وأُزيلت الدالة المساعدة في مكتبة scikit-learn الإصدار 0.22. استخدم الدالة fetch_openml('mnist_784', version=1) بدلاً منها. تُعيد هذه الدالة نفس الأرقام المُسطّحة البالغ عددها 70,000 رقمًا بحجم 784 بكسل، وبالتالي تستمر خطوات التحجيم والتقسيم المذكورة في هذا الدليل بالعمل.

تُقرأ هذه القيم على النحو التالي: الدفعة، الارتفاع، العرض، القنوات. لذا، فإن 14 × 14 هو الحجم المكاني بعد خطوة تجميع واحدة على رقم مكون من 28 × 28 خانة، و36 هو عدد المرشحات في طبقة الالتفاف هذه، خريطة ميزات واحدة لكل مرشح.

تلخيص هذه التدوينة بـ: