مساعدة في حماية الحاجز المرجاني العظيم مع TensorFlow على Kaggle تاريخ التحدي

التصنيف الأساسي: تصنيف صور الملابس

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

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

يستخدم هذا الدليل tf.keras ، وAPI رفيع المستوى لبناء وتدريب النماذج في TensorFlow.

# TensorFlow and tf.keras
import tensorflow as tf

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
2.5.0

قم باستيراد مجموعة بيانات Fashion MNIST

يستخدم هذا الدليل الأزياء MNIST مجموعة البيانات التي تحتوي على 70،000 الصور الرمادية في 10 فئات. تُظهر الصور مقالات فردية من الملابس بدقة منخفضة (28 × 28 بكسل) ، كما هو موضح هنا:

أزياء MNIST العفريت
الشكل 1. عينات الموضة MNIST (عن طريق زالاندو، MIT الترخيص).

ويهدف الأزياء MNIST بمثابة قطرة في بديل للالكلاسيكية MNIST مجموعة البيانات، غالبا ما تستخدم مثل "مرحبا، العالم" برامج التعلم آلة لرؤية الكمبيوتر. تحتوي مجموعة بيانات MNIST على صور لأرقام مكتوبة بخط اليد (0 ، 1 ، 2 ، وما إلى ذلك) بتنسيق مماثل لتنسيق سلع الملابس التي ستستخدمها هنا.

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

هنا ، يتم استخدام 60.000 صورة لتدريب الشبكة و 10000 صورة لتقييم مدى دقة تعلم الشبكة لتصنيف الصور. يمكنك الوصول إلى Fashion MNIST مباشرة من TensorFlow. استيراد و تحميل البيانات موضة MNIST مباشرة من TensorFlow:

fashion_mnist = tf.keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

يؤدي تحميل مجموعة البيانات إلى إرجاع أربعة مصفوفات NumPy:

  • و train_images و train_labels المصفوفات هي تدريب مجموعة -The البيانات الاستخدامات نموذج للتعلم.
  • يتم اختبار هذا النموذج على مجموعة الاختبار، و test_images ، و test_labels المصفوفات.

هذه الصور هي 28x28 صفائف نمباي، مع القيم بكسل تتراوح من 0 إلى 255. التسميات هي مجموعة من الأعداد الصحيحة التي تتراوح من 0 إلى 9. هذه تتوافق مع فئة من الملابس تمثل الصورة:

ملصق فصل
0 تي شيرت / توب
1 بنطلون
2 قف بجانب الطريق
3 فستان
4 معطف
5 صندل
6 قميص
7 حذاء رياضة
8 شنطة
9 التمهيد الكاحل

يتم تعيين كل صورة إلى تسمية واحدة. وبما أنه لا يتم تضمين أسماء فئة مع مجموعة البيانات، وتخزينها هنا لاستخدامها لاحقا عندما بالتآمر الصور:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

استكشف البيانات

دعنا نستكشف تنسيق مجموعة البيانات قبل تدريب النموذج. يوضح ما يلي أن هناك 60.000 صورة في مجموعة التدريب ، مع تمثيل كل صورة بحجم 28 × 28 بكسل:

train_images.shape
(60000, 28, 28)

وبالمثل ، هناك 60 ألف ملصق في مجموعة التدريب:

len(train_labels)
60000

كل تسمية عبارة عن عدد صحيح بين 0 و 9:

train_labels
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

هناك 10000 صورة في مجموعة الاختبار. مرة أخرى ، يتم تمثيل كل صورة بحجم 28 × 28 بكسل:

test_images.shape
(10000, 28, 28)

وتحتوي مجموعة الاختبار على 10000 ملصق صورة:

len(test_labels)
10000

المعالجة المسبقة للبيانات

يجب معالجة البيانات مسبقًا قبل تدريب الشبكة. إذا قمت بفحص الصورة الأولى في مجموعة التدريب ، فسترى أن قيم البكسل تقع في النطاق من 0 إلى 255:

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

بي إن جي

قم بتوسيع هذه القيم إلى نطاق من 0 إلى 1 قبل إطعامها إلى نموذج الشبكة العصبية. للقيام بذلك، تقسيم القيم التي كتبها 255. ومن المهم أن preprocessed مجموعة التدريب ومجموعة الاختبارات بنفس الطريقة:

train_images = train_images / 255.0

test_images = test_images / 255.0

للتحقق من أن البيانات بالشكل الصحيح وأنك على استعداد لبناء وتدريب الشبكة، دعونا تعرض 25 الصور الأولى من مجموعة التدريب وعرض اسم الفئة أسفل كل صورة.

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
plt.show()

بي إن جي

بناء النموذج

يتطلب بناء الشبكة العصبية تكوين طبقات النموذج ، ثم تجميع النموذج.

قم بإعداد الطبقات

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

يتكون معظم التعلم العميق من ربط الطبقات البسيطة معًا. معظم طبقات، مثل tf.keras.layers.Dense ، يكون المعلمات التي يتم تعلمها أثناء التدريب.

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10)
])

الطبقة الأولى في هذه الشبكة، tf.keras.layers.Flatten ، تحول شكل الصور من مجموعة ثنائية الأبعاد (من 28 بنسبة 28 بكسل) إلى مجموعة ذات بعد واحد (28 * 28 = 784 بكسل). فكر في هذه الطبقة على أنها صفوف غير مكدسة من وحدات البكسل في الصورة وتصطفها. هذه الطبقة ليس لديها معلمات لتعلمها ؛ يقوم فقط بإعادة تنسيق البيانات.

بعد بالارض بكسل، وشبكة تتكون من سلسلة من اثنين tf.keras.layers.Dense طبقات. هذه هي طبقات عصبية متصلة بكثافة أو متصلة بالكامل. أول Dense طبقة لها 128 العقد (أو الخلايا العصبية). تقوم الطبقة الثانية (والأخيرة) بإرجاع مصفوفة سجلات بطول 10. تحتوي كل عقدة على درجة تشير إلى أن الصورة الحالية تنتمي إلى إحدى الفئات العشر.

تجميع النموذج

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

  • وظيفة الخسارة ، هذا التدابير مدى دقة هذا النموذج هو أثناء التدريب. تريد تصغير هذه الوظيفة "لتوجيه" النموذج في الاتجاه الصحيح.
  • محسن ، هذا هو كيف يتم تحديث النموذج استنادا إلى البيانات التي تراها وظيفة خسارتها.
  • مقاييس -مستعملة لمراقبة التدريب وخطوات الاختبار. يستخدم المثال التالي دقة، وجزء من الصور التي يتم تصنيفها بشكل صحيح.
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

تدريب النموذج

يتطلب تدريب نموذج الشبكة العصبية الخطوات التالية:

  1. تغذية بيانات التدريب للنموذج. في هذا المثال، بيانات التدريب في train_images و train_labels المصفوفات.
  2. يتعلم النموذج ربط الصور والتسميات.
  3. أن تطلب من نموذج لبناء توقعات حول اختبار مجموعة في هذا المثال، test_images مجموعة.
  4. تحقق من أن التنبؤات تطابق التسميات من test_labels مجموعة.

تغذية النموذج

لبدء التدريب، استدعاء model.fit دعا طريقة لذلك لأنه "نوبات" نموذج للبيانات التدريب:

model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4982 - accuracy: 0.8256
Epoch 2/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3747 - accuracy: 0.8658
Epoch 3/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3356 - accuracy: 0.8770
Epoch 4/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3112 - accuracy: 0.8856
Epoch 5/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2941 - accuracy: 0.8915
Epoch 6/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2776 - accuracy: 0.8972
Epoch 7/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2678 - accuracy: 0.9000
Epoch 8/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2564 - accuracy: 0.9049
Epoch 9/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2467 - accuracy: 0.9083
Epoch 10/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2399 - accuracy: 0.9103
<tensorflow.python.keras.callbacks.History at 0x7fe108a0c150>

أثناء تدريب النموذج ، يتم عرض مقاييس الخسارة والدقة. يصل هذا النموذج إلى دقة تبلغ حوالي 0.91 (أو 91٪) على بيانات التدريب.

تقييم الدقة

بعد ذلك ، قارن كيفية أداء النموذج في مجموعة بيانات الاختبار:

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)
313/313 - 0s - loss: 0.3413 - accuracy: 0.8814

Test accuracy: 0.8813999891281128

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

قم بعمل تنبؤات

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

probability_model = tf.keras.Sequential([model, 
                                         tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)

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

predictions[0]
array([2.9212106e-07, 1.6208847e-10, 1.3363140e-08, 2.7341349e-09,
       5.5379962e-10, 4.5457238e-04, 4.2226111e-06, 4.4925120e-03,
       5.8868943e-07, 9.9504781e-01], dtype=float32)

التوقع هو مصفوفة من 10 أرقام. إنها تمثل "ثقة" النموذج في أن الصورة تتوافق مع كل قطعة من الملابس العشرة المختلفة. يمكنك معرفة التصنيف الذي يحتوي على أعلى قيمة ثقة:

np.argmax(predictions[0])
9

لذلك، هذا النموذج هو الأكثر ثقة من أن هذه الصورة هي التمهيد الكاحل، أو class_names[9] . يوضح فحص ملصق الاختبار أن هذا التصنيف صحيح:

test_labels[0]
9

ارسم هذا الرسم البياني لإلقاء نظرة على المجموعة الكاملة لتنبؤات الفئات العشرة.

def plot_image(i, predictions_array, true_label, img):
  true_label, img = true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  true_label = true_label[i]
  plt.grid(False)
  plt.xticks(range(10))
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

تحقق من التنبؤات

مع النموذج الذي تم تدريبه ، يمكنك استخدامه لعمل تنبؤات حول بعض الصور.

لنلقِ نظرة على مجموعة الصور والتنبؤات والتنبؤ 0. علامات التنبؤ الصحيحة باللون الأزرق وعناوين التنبؤ غير الصحيحة باللون الأحمر. يعطي الرقم النسبة المئوية (من 100) للتسمية المتوقعة.

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

بي إن جي

i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

بي إن جي

دعونا نرسم عدة صور مع توقعاتهم. لاحظ أن النموذج يمكن أن يكون خاطئًا حتى عندما يكون واثقًا جدًا.

# Plot the first X test images, their predicted labels, and the true labels.
# Color correct predictions in blue and incorrect predictions in red.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions[i], test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

بي إن جي

استخدم النموذج المدرب

أخيرًا ، استخدم النموذج المدرب لعمل توقع حول صورة واحدة.

# Grab an image from the test dataset.
img = test_images[1]

print(img.shape)
(28, 28)

tf.keras هي الأمثل نماذج للتنبؤ على دفعة أو مجموعة من الأمثلة في آن واحد. وفقًا لذلك ، على الرغم من أنك تستخدم صورة واحدة ، فأنت بحاجة إلى إضافتها إلى القائمة:

# Add the image to a batch where it's the only member.
img = (np.expand_dims(img,0))

print(img.shape)
(1, 28, 28)

الآن توقع التسمية الصحيحة لهذه الصورة:

predictions_single = probability_model.predict(img)

print(predictions_single)
[[8.8914348e-05 1.3264636e-13 9.9108773e-01 1.2658383e-10 8.1463791e-03
  1.6905785e-08 6.7695131e-04 2.7492119e-17 5.1699739e-10 7.1339325e-17]]
plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
plt.show()

بي إن جي

tf.keras.Model.predict بإرجاع قائمة من قائمة القوائم واحدة لكل صورة في دفعة من البيانات. احصل على تنبؤات صورتنا (فقط) في الدفعة:

np.argmax(predictions_single[0])
2

ويتوقع النموذج تسمية كما هو متوقع.

# MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.