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

تتكون الصورة من مصفوفة من البكسلات ذات ارتفاع وعرض. تحتوي الصورة الرمادية على قناة واحدة فقط، بينما تحتوي الصورة الملونة على ثلاث قنوات (واحدة للأحمر، وواحدة للأخضر، وواحدة للأزرق). تتراص هذه القنوات فوق بعضها. في هذا الدرس، ستستخدم صورة رمادية ذات قناة واحدة فقط. لكل بكسل قيمة تتراوح بين 0 و255 لتعكس شدة اللون. على سبيل المثال، البكسل الذي قيمته 0 يُظهر اللون الأبيض، بينما البكسل الذي قيمته قريبة من 255 يُظهر اللون الداكن.
دعونا نلقي نظرة على الصورة المخزنة في مجموعة بيانات MNISTتوضح الصورة أدناه كيفية تمثيل الصورة الموجودة على اليسار في شكل مصفوفة. لاحظ أن المصفوفة الأصلية قد تم توحيد قيمها لتكون بين 0 و1. بالنسبة للألوان الداكنة، تبلغ القيمة في المصفوفة حوالي 0.9، بينما تبلغ قيمة البكسلات البيضاء 0.
عملية التفافية
يُعدّ الجزء التلافيفي المكوّن الأكثر أهمية في النموذج. ويهدف هذا الجزء إلى تقليل حجم الصورة لتسريع حسابات الأوزان وتحسين التعميم.
أثناء الجزء التلافيفي، تحافظ الشبكة على السمات الأساسية للصورة وتستبعد الضوضاء غير ذات الصلة. على سبيل المثال، يتعلم النموذج كيفية التعرف على الفيل من صورة بها جبل في الخلفية. إذا كنت تستخدم شبكة عصبية تقليدية، فسيقوم النموذج بتعيين وزن لجميع وحدات البكسل، بما في ذلك وحدات البكسل الموجودة في الجبل، وهو أمر غير ضروري ويمكن أن يضلل الشبكة.
بدلاً من ذلك ، أ Keras ستستخدم الشبكة العصبية الالتفافية تقنية رياضية لـtracيتم التركيز فقط على البكسلات الأكثر أهمية. تُسمى هذه العملية الرياضية بالالتفاف. تُمكّن هذه التقنية الشبكة من تعلّم خصائص أكثر تعقيدًا في كل طبقة. يقسم الالتفاف المصفوفة إلى أجزاء صغيرة لتعلم العناصر الأساسية داخل كل جزء.
مكونات الشبكة العصبية التلافيفية (ConvNet أو CNN)
تتكون الشبكة العصبية الالتفافية من أربعة مكونات:
- التفاف
- غير الخطية (ReLU)
- Poolinز أو أخذ العينات الفرعية
- التصنيف (طبقة متصلة بالكامل)
التفاف
الغرض من عملية الالتفاف هو الـtracتعتمد هذه التقنية على خصائص الكائن في الصورة محليًا. وهذا يعني أن الشبكة ستتعلم أنماطًا محددة داخل الصورة وستكون قادرة على التعرف عليها في كل مكان فيها.
الالتفاف هو عملية ضرب عنصري. المفهوم سهل الفهم. يقوم الحاسوب بمسح جزء من الصورة، عادةً بأبعاد 3×3، ثم يضربه بمرشح. يُسمى ناتج الضرب العنصري خريطة الميزات. تُكرر هذه الخطوة حتى يتم مسح الصورة بالكامل. لاحظ أنه بعد الالتفاف، يقل حجم الصورة.
يوضح الرسم البياني أدناه رقعة واحدة من الصورة يتم ضربها بواسطة المرشح لإنتاج خلية واحدة من خريطة الميزات.
يُظهر الرسم المتحرك أدناه نفس عملية الالتفاف التي تمتد عبر الصورة بأكملها.
تتوفر العديد من المرشحات. فيما يلي قائمة ببعضها. ستلاحظ أن لكل مرشح غرضًا محددًا. لاحظ أن مصطلح "النواة" في الصورة أدناه هو مرادف لكلمة "مرشح".
الحساب وراء الإلتواء
ستطبق مرحلة الالتفاف المرشح على مصفوفة صغيرة من البكسلات داخل الصورة. سيتحرك المرشح على طول الصورة المدخلة بشكل عام 3×3 أو 5×5. هذا يعني أن الشبكة ستُمرر هذه النوافذ عبر الصورة المدخلة بأكملها وتحسب الالتفاف. يوضح الرسم المتحرك أدناه كيفية عمل الالتفاف. حجم الرقعة 3×3، ومصفوفة الإخراج هي نتيجة العملية الحسابية بين مصفوفة الصورة والمرشح.
لاحظت أن عرض الإخراج وارتفاعه يمكن أن يختلفا عن عرض الإدخال وارتفاعه. يحدث ذلك بسبب تأثير الحدود.
تأثير الحدود
تحتوي الصورة على خريطة ميزات بحجم 5×5 وفلتر بحجم 3×3. توجد نافذة واحدة فقط في المركز حيث يمكن للفلتر تصفية شبكة بحجم 3×3. تتقلص خريطة الميزات الناتجة بمقدار مربعين على كل محور، لتصبح أبعادها 3×3.
للحصول على نفس أبعاد الإخراج كما في الإدخال، يجب إضافة حشو. يتضمن الحشو إضافة العدد المناسب من الصفوف والأعمدة على كل جانب من المصفوفة. سيسمح ذلك لعملية الالتفاف بتوسيط كل جزء من الإدخال. في الصورة أدناه، مصفوفتا الإدخال والإخراج لهما نفس الأبعاد، 5×5.
عند تحديد الشبكة، يتم التحكم في الميزات المجمعة بواسطة ثلاث معلمات:
عمق: يُحدد هذا عدد المرشحات التي تُطبق أثناء عملية الالتفاف. في المثال السابق، رأينا عمقًا يساوي 1، ما يعني استخدام مرشح واحد فقط. في معظم الحالات، يُستخدم أكثر من مرشح. يُظهر الرسم المتحرك أدناه العمليات التي تُجرى في حالة استخدام ثلاثة مرشحات.
خطوة: يُحدد هذا الخيار عدد "قفزات البكسل" بين شريحتين. إذا كانت قيمة الخطوة تساوي 1، فستتحرك النافذة بمقدار بكسل واحد. أما إذا كانت تساوي 2، فستقفز بمقدار بكسلين. بزيادة قيمة الخطوة، ستحصل على خرائط ميزات أصغر. يقارن الرسمان البيانيان أدناه بين خطوة تساوي 1 وخطوة تساوي 2.
مثال الخطوة 1
الخطوة 2
إضافة أصفار: تُعرف عملية الحشو بإضافة عدد مماثل من الصفوف والأعمدة على جانبي خرائط المعالم المدخلة. في هذه الحالة، يكون للمخرجات نفس أبعاد المدخلات.
غير الخطية (ReLU)
في نهاية عملية الالتفاف، تُطبَّق دالة تنشيط على الناتج للسماح باللاخطية. دالة التنشيط الشائعة في الشبكات العصبية الالتفافية هي ReLU. تُستبدل جميع البكسلات ذات القيمة السالبة بالصفر.
Pooling Operaالإنتاج
هذه الخطوة سهلة الفهم. الغرض من التجميع هو تقليل أبعاد الصورة المدخلة. تُنفذ هذه الخطوات لتقليل التعقيد الحسابي للعملية. بتقليل الأبعاد، يقل عدد الأوزان التي يتعين على الشبكة حسابها، مما يمنع فرط التخصيص.
في هذه المرحلة، عليك تحديد الحجم والخطوة. إحدى الطرق الشائعة لتجميع الصورة المدخلة هي استخدام القيمة القصوى لخريطة الميزات. انظر إلى الصورة أدناه. سيقوم التجميع بفحص أربع مصفوفات فرعية من خريطة الميزات 4×4 وإرجاع القيمة القصوى. يأخذ التجميع القيمة القصوى لمصفوفة 2×2 ثم يحرك هذه النافذة بمقدار بكسلين. على سبيل المثال، المصفوفة الفرعية الأولى هي [3,1,3,2]، لذا سيرجع التجميع القيمة القصوى، وهي 3.
هناك عملية تجميع أخرى مثل المتوسط.
تعمل هذه العملية على تقليل حجم خريطة المعالم بشكل كبير.
طبقات متصلة بالكامل
الخطوة الأخيرة تتكون من بناء التقليدية شبكة اعصاب صناعية كما فعلت في البرنامج التعليمي السابق. تقوم بتوصيل جميع الخلايا العصبية من الطبقة السابقة إلى الطبقة التالية. يمكنك استخدام وظيفة تنشيط softmax لتصنيف الرقم الموجود على صورة الإدخال.
خلاصة:
تقوم الشبكة العصبية الالتفافية في TensorFlow بتجميع طبقات مختلفة قبل إجراء التنبؤ. تتكون الشبكة العصبية مما يلي:
- طبقة تلافيفية
- وظيفة تنشيط ReLU
- Poolinطبقة ز
- طبقة متصلة بكثافة
تُطبّق الطبقات الالتفافية مرشحات مختلفة على منطقة فرعية من الصورة. وتُضيف دالة التنشيط ReLU خاصية اللاخطية، بينما تُقلّل طبقات التجميع من أبعاد خرائط الميزات.
كل هذه الطبقات مثالtracتُستخلص المعلومات الأساسية من الصور. وأخيرًا، تُغذى خرائط الميزات إلى طبقة متصلة بالكامل مع دالة softmax لإجراء التنبؤ.
تدريب CNN مع TensorFlow
الآن وقد أصبحت على دراية بمكونات الشبكة العصبية الالتفافية، فأنت جاهز لبناء واحدة باستخدام TensorFlow. سوف نستخدم مجموعة بيانات MNIST لتصنيف صور CNN.
إن إعداد البيانات هو نفس ما تم في البرنامج التعليمي السابق. يمكنك تشغيل التعليمات البرمجية والانتقال مباشرة إلى بنية CNN.
ستتبع الخطوات أدناه لتصنيف الصور باستخدام CNN:
- الخطوة 1: تحميل مجموعة البيانات
- الخطوة 2: طبقة الإدخال
- الخطوة 3: الطبقة التلافيفية
- الخطوة 4 : Poolinطبقة ز
- الخطوة 5: الطبقة التلافيفية الثانية و Poolinطبقة ز
- الخطوة 6: طبقة كثيفة
- الخطوة 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) مرشحات على وحدات البكسل الخام للصورة لتعلم أنماط تفصيلية مقارنةً بالأنماط العامة التي تتعلمها الشبكة العصبية التقليدية. لبناء شبكة عصبية تلافيفية، عليك تحديد ما يلي:
- طبقة الالتفاف: يتم تطبيق عدد n من المرشحات على خريطة الميزات. بعد الالتفاف، يجب استخدام دالة التنشيط ReLU لإضافة اللاخطية إلى الشبكة.
- Poolinطبقة g: الخطوة التالية بعد عملية الالتفاف هي تقليل أبعاد خريطة الميزات. والهدف من ذلك هو تقليل أبعاد خريطة الميزات لمنع التجاوز وتحسين سرعة الحساب. التجميع الأقصى هو الأسلوب التقليدي، حيث يقسم خرائط الميزات إلى مناطق فرعية (عادةً بحجم 2×2) ويحتفظ فقط بالقيم القصوى.
- الطبقات المتصلة بالكامل: جميع الخلايا العصبية من الطبقات السابقة متصلة بالطبقات التالية. ستقوم 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) أداءً مذهلاً مع مجموعات الصور الأكبر، سواءً من حيث سرعة الحساب أو الدقة.











