با TensorFlow یک مدل بینایی کامپیوتری بسازید

1. قبل از شروع

در این آزمایشگاه کد، شما یک مدل بینایی کامپیوتری ایجاد می کنید که می تواند اقلام لباس را با TensorFlow تشخیص دهد.

پیش نیازها

  • دانش کامل پایتون
  • مهارت های اولیه برنامه نویسی

چیزی که یاد خواهید گرفت

در این کد لبه، شما:

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

چیزی که خواهی ساخت

  • یک شبکه عصبی که محصولات لباس را شناسایی می کند

آنچه شما نیاز دارید

اگر با TensorFlow هرگز یک شبکه عصبی برای بینایی کامپیوتری ایجاد نکرده‌اید، می‌توانید از Colaboratory، یک محیط مبتنی بر مرورگر که شامل تمام وابستگی‌های مورد نیاز است، استفاده کنید. می‌توانید کد بقیه کدهای در حال اجرا در Colab را پیدا کنید.

در غیر این صورت، زبان اصلی که برای آموزش مدل ها استفاده می کنید پایتون است، بنابراین باید آن را نصب کنید. علاوه بر آن، به TensorFlow و کتابخانه NumPy نیز نیاز دارید. می‌توانید درباره و نصب TensorFlow در اینجا اطلاعات بیشتری کسب کنید. NumPy را اینجا نصب کنید.

2. شروع به کدنویسی کنید

ابتدا از طریق نوت بوک اجرایی Colab قدم بزنید.

با وارد کردن TensorFlow شروع کنید.

import tensorflow as tf
print(tf.__version__)

شما یک شبکه عصبی را آموزش خواهید داد تا اقلام لباس را از یک مجموعه داده رایج به نام Fashion MNIST تشخیص دهد. این شامل 70000 لباس در 10 دسته مختلف است. هر لباس در یک تصویر 28x28 در مقیاس خاکستری است. می توانید چند نمونه را در اینجا ببینید:

برچسب های مرتبط با مجموعه داده عبارتند از:

برچسب

شرح

0

تی شرت/تاپ

1

شلوار

2

پلیور

3

لباس پوشیدن

4

کت

5

کفش راحتی

6

پیراهن

7

کفش ورزشی

8

کیسه

9

نیم بوت

داده های Fashion MNIST در tf.keras.datasets API موجود است. به این صورت بارگذاری کنید:

mnist = tf.keras.datasets.fashion_mnist

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

(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

آن ارزش ها چگونه به نظر می رسند؟ برای مشاهده تصویر آموزشی و برچسب آموزشی را چاپ کنید. شما می توانید با شاخص های مختلف در آرایه آزمایش کنید.

import matplotlib.pyplot as plt
plt.imshow(training_images[0])
print(training_labels[0])
print(training_images[0])

چاپ داده های مورد 0 به این صورت است:

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

training_images  = training_images / 255.0
test_images = test_images / 255.0

همچنین ممکن است بخواهید به 42 نگاهی بیندازید، بوت متفاوتی نسبت به آنچه در شاخص 0 قرار دارد.

اکنون، ممکن است تعجب کنید که چرا دو مجموعه داده وجود دارد - آموزش و آزمایش.

ایده این است که یک مجموعه داده برای آموزش داشته باشیم و مجموعه دیگری از داده ها که مدل هنوز با آنها برخورد نکرده است تا ببیند چقدر می تواند مقادیر را طبقه بندی کند. از این گذشته، وقتی کارتان تمام شد، می خواهید از مدلی با داده هایی استفاده کنید که قبلاً ندیده بود! همچنین، بدون داده‌های آزمایش جداگانه، این خطر را خواهید داشت که شبکه فقط داده‌های آموزشی خود را بدون تعمیم دانش خود به خاطر بسپارد.

3. مدل را طراحی کنید

حالا مدل را طراحی کنید. شما سه لایه خواهید داشت. آنها را یک به یک مرور کنید و انواع مختلف لایه ها و پارامترهای مورد استفاده برای هر کدام را بررسی کنید.

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), 
                                    tf.keras.layers.Dense(128, activation=tf.nn.relu), 
                                    tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  • Sequential دنباله ای از لایه ها را در شبکه عصبی تعریف می کند.
  • Flatten یک مربع می گیرد و آن را به یک بردار یک بعدی تبدیل می کند.
  • Dense لایه ای از نورون ها را اضافه می کند.
  • توابع Activation به هر لایه از نورون ها می گویند که چه کاری انجام دهند. گزینه های زیادی وجود دارد، اما فعلا از آنها استفاده کنید:
  • Relu در واقع به این معنی است که اگر X بزرگتر از 0 باشد، X را برگرداند، در غیر این صورت 0 را برگرداند. فقط مقادیر 0 یا بیشتر را به لایه بعدی در شبکه ارسال می کند.
  • Softmax مجموعه ای از مقادیر را می گیرد و به طور موثر بزرگترین آنها را انتخاب می کند. به عنوان مثال، اگر خروجی آخرین لایه مانند [0.1، 0.1، 0.05، 0.1، 9.5، 0.1، 0.05، 0.05، 0.05] باشد، شما را از مرتب کردن برای بزرگترین مقدار نجات می دهد - [0، 0,0,0,1,0,0,0,0].

4. مدل را کامپایل و آموزش دهید

اکنون که مدل تعریف شده است، کار بعدی ساخت آن است. ابتدا یک مدل را با یک تابع optimizer و loss کامپایل کنید، سپس آن را بر روی داده ها و برچسب های آموزشی خود آموزش دهید. هدف این است که مدل رابطه بین داده های آموزشی و برچسب های آموزشی آن را دریابد. بعداً، می‌خواهید مدل شما داده‌هایی را ببیند که شبیه داده‌های آموزشی شما هستند، سپس پیش‌بینی کنید که این داده‌ها چگونه باید باشند.

به استفاده از metrics= به عنوان یک پارامتر توجه کنید، که به TensorFlow اجازه می دهد تا با بررسی نتایج پیش بینی شده در برابر پاسخ های شناخته شده (برچسب ها) از دقت آموزش گزارش دهد.

model.compile(optimizer = tf.keras.optimizers.Adam(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5)

هنگامی که model.fit اجرا می شود، از دست دادن و دقت را خواهید دید:

Epoch 1/5
60000/60000 [=======] - 6s 101us/sample - loss: 0.4964 - acc: 0.8247
Epoch 2/5
60000/60000 [=======] - 5s 86us/sample - loss: 0.3720 - acc: 0.8656
Epoch 3/5
60000/60000 [=======] - 5s 85us/sample - loss: 0.3335 - acc: 0.8780
Epoch 4/5
60000/60000 [=======] - 6s 103us/sample - loss: 0.3134 - acc: 0.8844
Epoch 5/5
60000/60000 [=======] - 6s 94us/sample - loss: 0.2931 - acc: 0.8926

هنگامی که آموزش مدل انجام شد، در پایان دوره نهایی مقدار دقت را مشاهده خواهید کرد. ممکن است چیزی شبیه به 0.8926 در بالا به نظر برسد. این به شما می گوید که شبکه عصبی شما در طبقه بندی داده های آموزشی حدود 89 درصد دقت دارد. به عبارت دیگر، یک تطابق الگوی بین تصویر و برچسب‌ها را کشف کرد که در 89 درصد مواقع کار می‌کردند. عالی نیست، اما بد نیست با توجه به اینکه فقط برای پنج دوره آموزش داده شد و به سرعت انجام شد.

5. مدل را تست کنید

عملکرد مدل بر روی داده هایی که ندیده است چگونه خواهد بود؟ به همین دلیل مجموعه تست را دارید. شما model.evaluate را فراخوانی می‌کنید و در دو مجموعه پاس می‌کنید و ضرر را برای هر کدام گزارش می‌کند. آن را امتحان کنید:

model.evaluate(test_images, test_labels)

و این هم خروجی:

10000/10000 [=====] - 1s 56us/sample - loss: 0.3365 - acc: 0.8789
[0.33648381242752073, 0.8789]

این مثال دقت 0.8789 را نشان داد، به این معنی که حدود 88٪ دقیق بود. (ممکن است مقادیر کمی متفاوت داشته باشید.)

همانطور که انتظار می رفت، این مدل با داده های ناشناخته به اندازه داده هایی که روی آن آموزش دیده بود دقیق نیست! همانطور که درباره TensorFlow اطلاعات بیشتری کسب می کنید، راه هایی برای بهبود آن پیدا خواهید کرد.

برای کشف بیشتر، تمرینات را در مرحله بعد امتحان کنید.

6. تمرینات اکتشافی

تمرین 1

برای این تمرین اول، کد زیر را اجرا کنید:

classifications = model.predict(test_images)
print(classifications[0])

مجموعه ای از طبقه بندی ها را برای هر یک از تصاویر آزمایشی ایجاد می کند، سپس اولین ورودی در طبقه بندی ها را چاپ می کند. خروجی پس از اجرای آن لیستی از اعداد است. به نظر شما چرا اینطور است و آن اعداد نشان دهنده چیست؟

اجرای print(test_labels[0]) امتحان کنید و نمره 9 را دریافت خواهید کرد.

خروجی مدل یک لیست 10 عددی است. این اعداد احتمالی هستند که ارزش طبقه بندی شده برچسب مربوطه است. به عنوان مثال، اولین مقدار در لیست احتمال این است که لباس از کلاس 0 باشد و مقدار بعدی 1 است. توجه کنید که احتمالات همه آنها بسیار کم است به جز یک. همچنین، به دلیل Softmax ، تمام احتمالات موجود در لیست به 1.0 می رسد.

لیست و برچسب ها بر اساس 0 هستند، بنابراین نیم بوت با برچسب 9 به این معنی است که دهمین کلاس از 10 کلاس است. فهرستی که دارای دهمین عنصر است که بالاترین مقدار را دارد به این معنی است که شبکه عصبی پیش‌بینی کرده است که موردی که طبقه‌بندی می‌کند به احتمال زیاد یک چکمه مچ پا است.

تمرین 2

به لایه های مدل خود نگاه کنید. با مقادیر مختلف برای لایه متراکم با 512 نورون آزمایش کنید.

چه نتایج متفاوتی برای از دست دادن و زمان تمرین به دست می آورید؟ به نظر شما چرا اینطور است؟

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

تمرین 3

اگر لایه Flatten() را حذف کنید چه اتفاقی می افتد. به نظر شما چرا اینطور است؟

در مورد شکل داده ها با خطا مواجه می شوید. جزئیات خطا ممکن است در حال حاضر مبهم به نظر برسد، اما این قانون کلی را تقویت می کند که اولین لایه در شبکه شما باید به شکل داده های شما باشد. در حال حاضر داده‌های شما تصاویر ۲۸×۲۸ است و ۲۸ لایه از ۲۸ نورون غیرممکن است، بنابراین منطقی‌تر است که آن ۲۸،۲۸ را به ۷۸۴×۱ صاف کنید.

به جای نوشتن همه کدها، لایه Flatten() را در ابتدا اضافه کنید. وقتی آرایه‌ها بعداً در مدل بارگذاری می‌شوند، به‌طور خودکار برای شما مسطح می‌شوند.

تمرین 4

لایه های نهایی (خروجی) را در نظر بگیرید. چرا 10 تا هستند؟ اگر مقداری متفاوت از 10 داشتید چه اتفاقی می افتاد؟

سعی کنید شبکه را با 5 آموزش دهید. به محض اینکه یک مقدار غیرمنتظره پیدا کرد با خطا مواجه می شوید. یک قانون سرانگشتی دیگر - تعداد نورون‌ها در آخرین لایه باید با تعداد کلاس‌هایی که برای آنها طبقه‌بندی می‌کنید مطابقت داشته باشد. در این مورد، ارقام 0 تا 9 هستند، بنابراین 10 عدد از آنها وجود دارد، بنابراین شما باید 10 نورون در لایه نهایی خود داشته باشید.

تمرین 5

اثرات لایه های اضافی در شبکه را در نظر بگیرید. اگر یک لایه دیگر بین لایه 512 و لایه نهایی 10 اضافه کنید چه اتفاقی می افتد؟

تأثیر قابل توجهی وجود ندارد زیرا داده های نسبتاً ساده هستند. برای داده های بسیار پیچیده تر، لایه های اضافی اغلب لازم است.

تمرین 6

قبل از آموزش، داده‌ها را نرمال می‌کردید و از مقادیر 0 تا 255 به مقادیر 0 تا 1 می‌رفتید. حذف آن چه تأثیری خواهد داشت؟ در اینجا کد کاملی برای امتحان وجود دارد (توجه داشته باشید که دو خطی که داده‌ها را عادی می‌کنند، نظر داده می‌شوند).

چرا فکر می کنید نتایج متفاوتی می گیرید؟ در اینجا یک پاسخ عالی در مورد Stack Overflow وجود دارد.

import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
#training_images=training_images/255.0
#test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5)
model.evaluate(test_images, test_labels)
classifications = model.predict(test_images)
print(classifications[0])
print(test_labels[0])

7. پاسخ تماس ها را کاوش کنید

قبلاً، زمانی که برای دوره‌های اضافی تمرین می‌کردید، مشکلی داشتید که ممکن است باخت شما تغییر کند. ممکن است مدتی طول بکشد تا شما منتظر آموزش برای انجام این کار باشید و ممکن است فکر کرده باشید که خوب است اگر بتوانید زمانی که به یک مقدار دلخواه مانند دقت 95 درصد رسیدید، تمرین را متوقف کنید. اگر بعد از 3 دوره به آن رسیدید، چرا دور هم بنشینید تا دوره های بسیار بیشتری به پایان برسد؟

مانند هر برنامه دیگری، شما تماس های تماس دارید! آنها را در عمل ببینید:

import tensorflow as tf

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('accuracy')>0.95):
      print("\nReached 95% accuracy so cancelling training!")
      self.model.stop_training = True

callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])

8. تبریک می گویم

شما اولین مدل بینایی کامپیوتری خود را ساخته اید! برای یادگیری نحوه ارتقای مدل‌های بینایی رایانه خود، به ساخت convolutions و انجام ادغام ادامه دهید.