آموزش رایگان Tensorflow; دسته بندی نوع لباس با هوش مصنوعی

در پست قبلی آموزش رایگان TensorFlow با نحوه راه اندازی TensorFlow و فلسفه کاری اون آشنا شدید. اینبار در p30script میخواهیم یک شبکه عصبی راه اندازی کنیم که می تواند نوع لباس ها را تشخیص دهد و آن ها را دسته بندی کند.

این سری از آموزش رایگان TensorFlow یک مدل شبکه عصبی را برای طبقه بندی تصاویر از لباس ها، مانند کفش ورزشی و پیراهن، آموزش می دهد. اشکالی ندارد اگر همه جزئیات را درک نکنید ، این یک مرور سریع از یک برنامه کامل TensorFlow است که با جزئیات توضیح داده شده است. ما در این آموزش  از tf.keras ، که یک API سطح بالا برای ساخت و آموزش مدل ها در TensorFlow استفاده می کنیم. قطعه کد زیر ، کتابخانه های لازم را فراخوانی میکند.

 

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf

from tensorflow import keras

import numpy as np

import matplotlib.pyplot as plt

 

نگران این نباشید که الآن با این موارد آشنایی ندارید. این پست، یک نمونه واقعی از کارهایی است که می توانید به صورت رایگان با TensorFlow انجام دهید. خوب حالا باید دیتاست را فراخوانی کنیم. ما از دیتاست Fashion MNIST برای این تست استفاده خواهیم کرد. این دیتاست دارای ۷۰ هزار تصویر ۲۸ در ۲۸ پیکسلی است که در ۱۰ دسته قرار دارند.Fashion MNIST به عنوان جایگزینی برای مجموعه داده های کلاسیک MNIST در نظر گرفته شده است – که اغلب به عنوان “Hello, World” یادگیری ماشین (machine learning) از آن یاد می شود، البته برای شاخه بینایی ماشین (computer vision) .

 

"<yoastmark

 

دیتاست :

 

ما از ۶۰،۰۰۰ تصویر برای آموزش شبکه و ۱۰،۰۰۰ تصویر برای  ارزیابی دقیق شبکه استفاده می کنیم. خوشبختانه این دیتاست به همراه TensorFlow است و می توانید مستقیماً به Fashion MNIST دسترسی پیدا کنید ، فقط داده را وارد کرده و بارگیری کنید:

 

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

 

در این فراخوانی با ۴ آرایه Numpy روبرو خواهیم بود:

  1. مجموعه های train_images و train_labels مجموعه آموزش هستند- داده هایی که مدل برای یادگیری از آن استفاده می کند.
  2. ما از آرایه های test_images و test_labels  برای تست یادگیری سیستم خود استفاده خواهیم کرد.

تصاویر آرایه هایی با ابعاد ۲۸×۲۸ هستند و مقادیر پیکسل آنها بین ۰ تا ۲۵۵ است. برچسب ها (Labels) آرایه ای از عدد صحیح هستند و از ۰ تا ۹ متغیر هستند. اینها مطابق با کلاس(Class) لباس هایی هستند که تصویر نشان می دهد:

 

آموزش_رایگان_TensorFlow_2

 

هر تصویر به یک برچسب واحد نقشه (mapped) می شود. از آنجا که نام کلاس در مجموعه داده ها قرار ندارد ، آنها را در اینجا ذخیره کنید تا بعداً هنگام ترسیم تصاویر از آنها استفاده کنید:

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

اولین قدم در راه اندازی آموزش به یک سیستم هوشمند، شناختن دیتا می باشد. شما در این آموزش در حال پیاده سازی یادگیری با مربی هستید ( supervised learning). یعنی شما خود بهتر از هر شخص دیگری داده های مسئله را می شناسید و می توانید به ماشین هوشمند یاد دهید که چگونه مسئله را حل کند. با اجرا گرفتن train_images.shape می تواند ابعاد آرایه خود را مشاهده کنید;(۶۰۰۰۰, ۲۸, ۲۸)، یعنی ما با ۶۰۰۰۰ هزار تصویر با ابعاد ۲۸ در ۲۸ روبرو هستیم. قطعه کد train_labels به یک آرایه از شماره برچسب های موجود را نشان می دهد:

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

 

پردازش داده

 

داده ها باید قبل از آموزش شبکه از قبل پردازش شوند. اگر اولین تصویر را در مجموعه آموزش مشاهده کنید ، میبینید که مقادیر پیکسل در محدوده ۰ تا ۲۵۵ قرار می گیرند. برای این که این مورد را بهتر متوجه شوید. کد زیر را اجرا بگیرید:

 

plt.figure()

plt.imshow(train_images[0])

plt.colorbar()

plt.grid(False)

plt.show()

خروجی کد با خوش شانسی، یک تصویر از دیتا ست خواهد بود مثلا :

 

آموزش_رایگان_TensorFlow_1
آموزش رایگان TensorFlow

 

ما قبل از تغذیه با مدل شبکه عصبی ، این مقادیر را به طیف ۰ تا ۱ می رسیم. برای این کار ، مقادیر را با ۲۵۵ تقسیم می کنیم. مهم است که مجموعه تمرین و مجموعه تست به همان روش از پیش آماده شده باشند:

 

train_images = train_images / 255.0

test_images = test_images / 255.0

ساختن مدل یادگیری :

 

ساخت شبکه عصبی نیاز به پیکربندی لایه های مدل دارد و سپس تدوین مدل.لایه ها (Layers) اصلی ساختمان یک شبکه عصبی هستند. لایه ها هستند که با استفاده از داده های ورودی یک نمایش کلی از فضای مسئله فراهم می کنند. امیدوارم که این بازنمایی ها برای مسئله مورد نظر معنی بیشتری دارند 😀 .

 

بیشتر یادگیری عمیق شامل پیوند دادن لایه های ساده است. اکثر لایه ها ، مانند tf.keras.layers.Dense ، پارامترهایی دارند که در طول آموزش آموخته می شوند. مدل ما در این آموزش :

 

model = keras.Sequential([

    keras.layers.Flatten(input_shape=(28, 28)),

    keras.layers.Dense(128, activation=tf.nn.relu),

    keras.layers.Dense(10, activation=tf.nn.softmax)

])

 

اولین لایه در این شبکه ، tf.keras.layers.Flatten ، فرمت تصاویر را از یک آرایه ۲d (از ۲۸ در ۲۸ پیکسل) ، به یک آرایه ۱d از ۲۸ * ۲۸ = ۷۸۴ پیکسل تبدیل می کند. این لایه هیچ پارامتری برای یادگیری ندارد. این فقط داده ها را تغییر می دهد. پس از مساوی شدن پیکسل ها ، شبکه شامل توالی از دو لایه tf.keras.layers.Dense است.به این لایه ها fully-connected نیز گفته می شود. اولین لایه متراکم دارای ۱۲۸ گره (یا نورون) است. لایه دوم (و آخرین) یک لایه softmax 10 گره است – این یک آرایه از ۱۰ نمره احتمال را می گیرد که به ۱ می رسد.

 

Compile the model:

 

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

  1. تابع loss :این میزان دقیق بودن مدل در حین آموزش را اندازه گیری می کند. ما می خواهیم این عملکرد را به حداقل برسانیم تا مدل را در جهت درست هدایت کنیم.
  2. بهینه ساز (optimizer) : در این قسمت مدل ما بر اساس داده هایی که میبیند و در صد loss یا همان از تشخیص اشتباه ُ اقدام به بهینه سازی خود میکند. ما در این آموزش از Adman Optimizer استفاده می کنیم.
  3. معیار ها (Metrics) :برای نظارت بر مراحل آموزش و آزمایش استفاده می شود. در مثال زیر از دقت استفاده می شود ، کسری از تصاویر که به درستی طبقه بندی شده اند.

 

model.compile(optimizer='adam',

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy'])

سرانجام مرحله Train the model:

 

آموزش مدل شبکه عصبی مراحل زیر را می طلبد:

  1. دادن خوراک به مدل، آقا ما این تصاویری که جدا کرده بودم برای آموزش رو میدیم مدل بخوره 😀 چاق بشه چله بشه…
  2. مدل ما یاد میگیرد که تصاویر را به برچسب ها نسبت دهد.
  3. ما از مدل می خواهیم پیش بینی هایی را در مورد یک مجموعه تست انجام دهد — در این مثال آرایه test_images. ما تایید می کنیم که پیش بینی ها با برچسب های مجموعه test_labels مطابقت دارند.

 

برای شروع آموزش ، ما متد  model.fit را فراخوانی میکنیم، epochs‌ هم تعداد دفعات ورودی داده به مدل را نشان می دهد. می توانید با افزایش این مورد ، میزان درستی (accuracy) را افزایش دهید اما نه همیشه 😐.

 

model.fit(train_images, train_labels, epochs=5)

 

نتیجه این کد :

Epoch 1/5

۶۰۰۰۰/۶۰۰۰۰ [==============================] - ۴s 75us/sample - loss: 0.5018 - acc: 0.8241

Epoch 2/5

۶۰۰۰۰/۶۰۰۰۰ [==============================] - ۴s 71us/sample - loss: 0.3763 - acc: 0.8643

Epoch 3/5

۶۰۰۰۰/۶۰۰۰۰ [==============================] - ۴s 71us/sample - loss: 0.3382 - acc: 0.8777

Epoch 4/5

۶۰۰۰۰/۶۰۰۰۰ [==============================] - ۴s 72us/sample - loss: 0.3138 - acc: 0.8846

Epoch 5/5

۶۰۰۰۰/۶۰۰۰۰ [==============================] - ۴s 72us/sample - loss: 0.2967 - acc: 0.8897

** آقا مبارکه ** با آموزش مدل ، معیارهای از دست دادن و دقت نمایش داده می شوند. این مدل در داده های آموزش به دقت حدود ۰٫۸۸ (یا ۸۸٪) می رسد.

 

رستاخیز:

 

زمان جواب پس دادن است . خوب حالا آن ۱۰۰۰۰ تصویر ناقابل را که اول آموزش جدا کرده بودیم، به مدل داده و میزان صحت عملکرد مدل را به چالش می کشیم. ساده است ما برچسب ها را می دانیم. تصویر را به مدل میدهیم و می گوییم حدس بزن این تصویر کدام برچسب بین ۰ تا ۹ است. یک مقایسه حدث و برچسب درون دست ما، عیار مدل را مشخص می کند:

 

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

print('Test accuracy:', test_acc)

خوب اینجا نتیجه بدک نیست :

 

۱۰۰۰۰/۱۰۰۰۰ [==============================] - ۱s 51us/sample - loss: 0.3653 - acc: 0.8671

Test accuracy: 0.8671

به نظر می رسد ، دقت در مجموعه داده های آزمون کمی کمتر از صحت در مجموعه داده های آموزش است. این فاصله بین دقت آموزش و صحت آزمون نمونه ای از بیش از حد اتصالات(Overfitting)  است. اتصال بیش از حد زمانی است که یک مدل یادگیری ماشین نسبت به داده های آموزش آنها روی داده های جدید عملکرد بدتری دارد.

خوب بیاید چند نمونه کوچک انجام دهیم :

predictions = model.predict(test_images)

و در آخر هر عکس تصادفی را که دوست دارید به predictions  بدهید و نتیجه را ببینید :

np.argmax(predictions[0])

 

و آن را با برچسب همان داده مقایسه کنید :

test_labels[0]

 

خوب ما الان مدلی داریم که با دیدن تصویر یکی از ۱۰ نوع لباس موجود در دیتاست Fashion MNIST را تشخیص دهد به همییییین راحتی آقا. در ادامه با آموزش رایگان TensorFlow ما همراه باشید لطفا.

 

منبع : https://www.tensorflow.org

 

دیدگاه کاربران
  • جواد هاشم زاده 19 آگوست 2019 / 9:35 ق.ظ

    سلام
    ممنون از مطلب خوبتون. خوب میشد اگه فایل اجرایی رو هم برای دانلود میزاشتید.

    • مهندس رحمان 24 آگوست 2019 / 6:34 ب.ظ

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

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

توسط
تومان