تنسورفلو ۱۱ : CNN

شبکه عصبی پیچشی چیست؟

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

قراره یاد بگیریم چگونه یک CNN بسازیم با TF که تصاویر CIFAR رو دسته بندی کنه :)



ساختار یک شبکه عصبی همگشتی

اگه با فیس بوک کار کرده باشید اوایل در هر تضویر مشخص می کردید چه کسانی حضور دارند ولی الان به وسیله CNN خودش به صورت هوشمند این کار رو انجام میده

یک CNN معمولی می تونه در تصویر زیر خلاصه بشه. ابتدا یک تصویر به شبکه داده میشه به عنوان ورودی. بعد تصویر ورودی وارد تعدادی قدم محدود میشه که این بخش همگشت ماجراست و در انتها وارد شبکه عصبی میشه که شماره عدد مشخص بشه.

CNN
CNN

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


عمل همگشت:

جز اصلی این مدل لایه همگشت هست که سعی می کنه با کاهش اندازه تصویر سرعت محاسبات را افزایش بده و در عمومی سازی مدل کمک کنه. در طول قسمت همگشت شبکه اجزا اصلی تصویر را حفظ می کنه و اجزا غیر مفید تصویر را خارج می کنه. مثلا در تشخیص فیل از پس زمینه اگه از شبکه های عصبی سنتی استفاده کنید به پس زمینه تصویر هم وزن هایی داده میشه که شاید حتی شبکه گمراه بشه جدا از سرعت کمتر.

در حالی که یک شبکه همگشتی از تکنیک های ریاضی استفاده می کنه که فقط پیکسل های مرتبط را خارج کنه.



اجزا شبکه همگشتی

  1. همگشت
  2. عمل غیر خطی (ReLU)
  3. جمع آوری یا زیر نمونه برداری
  4. طبقه بندی


  • همگشت

هدف همگشت استخراج ویژگی های شی داخل تصویر هست به این معنی که شبکه یاد میگیره پترن های خاص داخل تصویر رو تشخیص بده و هرجای دیگه پیدایش کنه.

همشگت یک ضرب جز به جز است. مدل هر قسمت از تصویر رو اسکن می کنه عموما با ابعاد 3*3 و در فیلتری ضرب می کنه. خروجی یک نقشه ویژگی یا feature map میشه. این مراحل طی میشه تا تمام تصویر اسکن بشه و پس از همگشت اندازه تصویر نیز کاهش پیدا می کنه.

همگشت
همگشت

برخی از فیلتر ها رو در زیر ببینید:


محاسبات همگشت

برای اینکه با جزییات بیشتر ببینید همگشت چجوری کار می کنه به تصویر زیر دقت کنید.


Border effect

تصویر 5*5 هست ولی فیلتر 3*3 اگه دقت کنید خانه وسط مربع فیلتر بر روی خانه اولی مربع تصویر هیچوقت قرار نمی گیره.

حالا اگه بخواهیم این اتفاق بیفته کاری که می کنیم اطراف تصویر یک سطر و ستون عدد 0 قرار میدیم تا این اثر رو جبران کنیم. و این کار باعث میشه ابعاد تصویر ورودی و خروجی یکی بشه.


وقتی شبکه رو می سازید ویژگی های تحت عمل همگشت به وسیله سه عامل کنترل میشه:

  • عمق: بیان کننده تعداد فیلتر های اعمالی هست که در مثال قبلی عمق یک بود چون فقط یک فیلتر اعمال شد.
  • اندازه جابه جایی: این معیار تعداد پیکسل هایی که هربار فیلتر بر روی آن ها جا به جا می شود رو تعیین می کنه. مثلا وقتی یک هست در هر مرحله فقط یک خانه جلو میره و اگه ۲ باشه هر مرحله ۲ خانه جلو میره. هرچی stride بیشتر باشه نقشه ویژگی ها کوچکتر میشه.
 stride = 1
stride = 1
stride = 2
stride = 2
  • صفر گذاری: افزودن سطر و ستون صفر به اطراف نقشه ویژگی ها
  • تابع فعال سازی (ReLU)

در پایان هم خروجی به یک تابع فعال سازی داده می شود تا نتیجه غیر خطی شود. عموما در CNN از ReLU استفاده میشه.

  • عملیات جمع حداکثری

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

یک سری روش ها برای این کار وجود داره مثل انتخاب بزرگترین عدد یا اینکه میانگین گیری

  • لایه های کاملا متصل

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

تعلیم CNN با TF

التدا تنسورفلو رو وارد می کنیم:

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf

from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

دیتاست رو بارگذاری می کنیم :

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0

یک نگاهی اول کار به داده های می اندازیم:

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
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)
    # The CIFAR labels happen to be arrays, 
    # which is why you need the extra index
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()

ساختار مدل رو می سازیم:

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

ساختار مدل رو بررسی می کنیم:

model.summary()

مدل رو می سازیم و شروع به تعلیم می کنیم:

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

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

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')

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

و میزان دقت رو چاپ می کنیم:

print(test_acc)

منابع

  • www.tensorflow.org
  • guru99.com