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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

هناك أربعة مكونات لشبكة Convnets

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

التفاف

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

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

التفاف

يوجد أدناه... URL لنرى عملياً كيف تعمل عملية الالتفاف.

التفاف

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

التفاف

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

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

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

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

تأثير الحدود

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

تأثير الحدود

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

تأثير الحدود

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

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

تأثير الحدود

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

مثال الخطوة 1

مثال على الخطوة

الخطوة 2

مثال على الخطوة

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

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

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

Pooling Operaالإنتاج

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

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

Pooling Operaالإنتاج

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

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

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

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

خلاصة:

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

  • طبقة تلافيفية
  • وظيفة تفعيل ريلو
  • Poolinطبقة ز
  • طبقة متصلة بكثافة

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

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

تدريب CNN مع TensorFlow

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

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

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

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

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

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

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

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

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

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

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

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

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

تحتاج إلى تقسيم مجموعة البيانات باستخدام 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 مرشحات على البكسل الخام للصورة لتعلم نمط التفاصيل ومقارنته بالنمط العالمي باستخدام شبكة عصبية تقليدية. لإنشاء 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. دعونا نرى بالتفصيل كيفية إنشاء كل كتلة بناء قبل تجميع كل شيء معًا في الوظيفة.

الخطوة 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طبقة ز

تحتوي الطبقة التلافيفية الثانية على 32 مرشحًا، بحجم إخراج [batch_size, 14, 14, 32]. تتمتع طبقة التجميع بنفس الحجم كما في السابق وشكل الإخراج هو [batch_size, 14, 14, 18].

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.

ستربط الطبقة الكثيفة 1764 خلية عصبية. قمت بإضافة وظيفة تفعيل Relu. علاوة على ذلك، يمكنك إضافة مصطلح تسوية التسرب بمعدل 0.3، مما يعني أنه سيتم تعيين 30 بالمائة من الأوزان على 0. لاحظ أن التسرب يحدث فقط أثناء مرحلة التدريب. تحتوي الدالة cnn_model_fn على وضع وسيطة للإعلان عما إذا كان النموذج بحاجة إلى التدريب أو التقييم كما هو موضح في مثال TensorFlow لتصنيف صور CNN أدناه.

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 CNN هي تحسين النموذج، أي العثور على أفضل قيم الأوزان. للقيام بذلك، يمكنك استخدام مُحسِّن نزول متدرج بمعدل تعلم يبلغ 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)

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

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

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

يستغرق تدريب CNN عدة مرات، لذلك يمكنك إنشاء خطاف تسجيل لتخزين قيم طبقات 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}

مع البنية الحالية، تحصل على دقة 97%. يمكنك تغيير البنية وحجم الدفعة وعدد التكرارات لتحسين الدقة. لقد كان أداء الشبكة العصبية CNN أفضل بكثير من ANN أو الانحدار اللوجستي. في البرنامج التعليمي حول الشبكة العصبية الاصطناعية، حصلت على دقة 96%، وهي أقل من CNN. أداء CNN مثير للإعجاب مع صورة أكبر طقمسواء من حيث سرعة الحساب أو الدقة.

ملخص

تعمل الشبكة العصبية التلافيفية بشكل جيد للغاية لتقييم الصورة. هذا النوع من الهندسة المعمارية هو السائد في التعرف على الأشياء من صورة أو مقطع فيديو.

لإنشاء TensorFlow CNN، عليك اتباع سبع خطوات:

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

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

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

هذه الخطوة تعيد تشكيل البيانات. الشكل يساوي الجذر التربيعي لعدد البكسلات. على سبيل المثال، إذا كانت الصورة تحتوي على 156 بكسل، فإن الشكل يكون 26×26. تحتاج إلى تحديد ما إذا كانت الصورة ملونة أم لا. إذا كانت الإجابة بنعم، فهذا يعني أن لديك 3 للشكل - 3 لـ RGB-، وإلا 1.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

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

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

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

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

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

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

الخطوة 5:: إضافة طبقة تلافيفية و Poolinطبقة ز

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

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

الخطوة 6 قم بتسوية السابقة لإنشاء طبقات متصلة بالكامل. في هذه الخطوة، يمكنك استخدام وظيفة تنشيط مختلفة وإضافة تأثير التسرب.

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:: طبقة السجل

الخطوة الأخيرة هي التنبؤ.

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

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