طبقه بندی اساسی: تصاویر لباس را طبقه بندی کنید

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

این راهنما یک مدل شبکه عصبی را برای طبقه بندی تصاویر لباس ، مانند کفش های کتانی و پیراهن آموزش می دهد. اشکالی ندارد اگر همه جزئیات را درک نکنید. این یک نمای کلی سریع از یک برنامه کامل 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 را وارد کنید

این راهنما از مجموعه داده Fashion MNIST استفاده می کند که شامل 70،000 تصویر در مقیاس خاکستری در 10 دسته است. تصاویر منسوجات لباس را با وضوح پایین (28 در 28 پیکسل) نشان می دهد ، همانطور که در اینجا مشاهده می شود:

شیک MNIST مد
شکل 1. نمونه های Fashion-MNIST (توسط Zalando ، مجوز MIT).

مد MNIST به عنوان یک قطره در جایگزینی برای کلاسیک در نظر گرفته شده MNIST مجموعه داده-اغلب به عنوان "سلام جهان" از برنامه های یادگیری ماشین برای بینایی کامپیوتر استفاده می شود. مجموعه داده های MNIST شامل تصاویری از رقم های دست نویس (0 ، 1 ، 2 و غیره) در قالبی مشابه فرم لباس هایی است که در اینجا استفاده خواهید کرد.

این راهنما از Fashion MNIST برای تنوع استفاده می کند و به دلیل اینکه مسئله کمی چالش برانگیزتر از MNIST معمولی است. هر دو مجموعه داده نسبتاً کوچک هستند و برای تأیید عملکرد الگوریتم مطابق انتظار استفاده می شوند. آنها شروع خوبی برای تست و اشکال زدایی کد هستند.

در اینجا ، 60،000 تصویر برای آموزش شبکه و 10،000 عکس برای ارزیابی میزان دقیق شبکه برای طبقه بندی تصاویر استفاده می شود. شما می توانید مستقیماً از TensorFlow به Fashion MNIST دسترسی پیدا کنید. داده های MNIST Fashion را مستقیماً از 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 آرایه مجموعه آموزش بانک داده ها با استفاده مدل به یادگیری هستند.
  • این مدل در برابر مجموعه ای آزمون، آزمایش 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،000 برچسب در مجموعه آموزش وجود دارد:

len(train_labels)
60000

هر برچسب یک عدد صحیح بین 0 تا 9 است:

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

10 هزار تصویر در مجموعه تست وجود دارد. باز هم ، هر تصویر به صورت 28 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()

png

قبل از تغذیه آنها با مدل شبکه عصبی ، این مقادیر را در محدوده 0 تا 1 مقیاس بندی کنید. برای انجام این کار ، مقادیر را بر 255 تقسیم کنید. مهم است که مجموعه آموزش و مجموعه آزمایش به همان روش پیش پردازش شوند:

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()

png

مدل را بسازید

ساخت شبکه عصبی نیاز به پیکربندی لایه های مدل و سپس تدوین مدل دارد.

لایه ها را تنظیم کنید

عنصر اصلی ساخت یک شبکه عصبی لایه است . لایه ها بازنمودهایی را از داده های موجود در آنها استخراج می کنند. امیدوارم که این بازنمایی ها برای مسئله موجود معنی دار باشند.

بیشتر یادگیری عمیق شامل زنجیر زدن لایه های ساده است. اکثر لایه ها مانند 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 گره (یا نورون) است. لایه دوم (و آخرین) یک آرایه logits با طول 10 را برمی گرداند. هر گره حاوی نمره ای است که نشان می دهد تصویر فعلی متعلق به یکی از 10 کلاس است.

مدل را تدوین کنید

قبل از اینکه مدل برای آموزش آماده شود ، به چند تنظیم دیگر نیاز دارد. اینها در مرحله کامپایل مدل اضافه می شوند:

  • عملکرد از دست دادن - این میزان دقت مدل در حین آموزش را اندازه گیری می کند. شما می خواهید این عملکرد را به حداقل برسانید تا مدل را در مسیر درست هدایت کنید.
  • Optimizer - این است که چگونه مدل بر اساس داده هایی که می بیند و عملکرد از دست دادن آن به روز می شود.
  • معیارها - برای نظارت بر مراحل آموزش و آزمایش استفاده می شود. در مثال زیر از دقت، بخشی از تصاویر است که به درستی است.
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

به نظر می رسد که دقت در مجموعه داده های آزمون کمی کمتر از دقت در مجموعه داده های آموزشی است. این فاصله بین دقت آموزش و دقت آزمون نشان دهنده وجود بیش از حد است . مجهز بودن بیش از حد زمانی اتفاق می افتد که مدل یادگیری ماشین در ورودی های جدید و قبلا دیده نشده عملکرد بدتری نسبت به داده های آموزش داشته باشد. یک مدل بیش از حد سر و صدا و جزئیات مجموعه داده های آموزشی را "به خاطر می سپارد" تا جایی که بر عملکرد مدل بر داده های جدید تأثیر منفی بگذارد. برای اطلاعات بیشتر ، به موارد زیر مراجعه کنید:

پیش بینی کنید

با استفاده از مدل آموزش داده شده ، می توانید از آن برای پیش بینی برخی از تصاویر استفاده کنید. خروجی های خطی مدل ، logits . یک لایه softmax وصل کنید تا logits را به احتمالات تبدیل کنید ، که تفسیر آنها آسان تر است.

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 عدد است. آنها نمایانگر "اعتماد به نفس" مدل هستند که تصویر مربوط به هر 10 ماده مختلف لباس است. می توانید ببینید کدام برچسب بیشترین مقدار اطمینان را دارد:

np.argmax(predictions[0])
9

بنابراین ، مدل اطمینان بیشتری دارد که این تصویر یک بوت مچ پا یا class_names[9] . بررسی برچسب آزمون نشان می دهد که این طبقه بندی صحیح است:

test_labels[0]
9

این را نمودار کنید تا به مجموعه کامل 10 پیش بینی کلاس نگاه کنید.

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()

png

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()

png

بیایید چندین تصویر را با پیش بینی های آنها ترسیم کنیم. توجه داشته باشید که این مدل حتی در مواقع اعتماد به نفس نیز می تواند اشتباه باشد.

# 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()

png

از مدل آموزش دیده استفاده کنید

سرانجام ، از مدل آموزش دیده برای پیش بینی یک تصویر واحد استفاده کنید.

# 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()

png

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.