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

شبکه عصبی پیچشی چیست؟شبکه عصبی پیچشی یا CNN یک متد شناخته شده در برنامه های بینایی ماشین هست که اهدافی از قبیل تشخیص اشیا در تصاویر یا ویدیو ها دارند.قراره یاد بگیریم چگونه یک CNN بسازیم با TF که تصاویر CIFAR رو دسته بندی کنه :)ساختار یک شبکه عصبی همگشتیاگه با فیس بوک کار کرده باشید اوایل در هر تضویر مشخص می کردید چه کسانی حضور دارند ولی الان به وسیله CNN خودش به صورت هوشمند این کار رو انجام میدهیک CNN معمولی می تونه در تصویر زیر خلاصه بشه. ابتدا یک تصویر به شبکه داده میشه به عنوان ورودی. بعد تصویر ورودی وارد تعدادی قدم محدود میشه که این بخش همگشت ماجراست و در انتها وارد شبکه عصبی میشه که شماره عدد مشخص بشه.CNNیک تصویر از آرایه ای از پیکسل ها تشکیل شده و یک تصویر سیاه و سفید یک کانال داره در حالی که تصویر رنگی سه کانال داره متشکل از رنگ های اصلی قرمز سبز و آبی.عمل همگشت:جز اصلی این مدل لایه همگشت هست که سعی می کنه با کاهش اندازه تصویر سرعت محاسبات را افزایش بده و در عمومی سازی مدل کمک کنه. در طول قسمت همگشت شبکه اجزا اصلی تصویر را حفظ می کنه و اجزا غیر مفید تصویر را خارج می کنه. مثلا در تشخیص فیل از پس زمینه اگه از شبکه های عصبی سنتی استفاده کنید به پس زمینه تصویر هم وزن هایی داده میشه که شاید حتی شبکه گمراه بشه جدا از سرعت کمتر.در حالی که یک شبکه همگشتی از تکنیک های ریاضی استفاده می کنه که فقط پیکسل های مرتبط را خارج کنه.اجزا شبکه همگشتیهمگشتعمل غیر خطی (ReLU)جمع آوری یا زیر نمونه برداریطبقه بندیهمگشتهدف همگشت استخراج ویژگی های شی داخل تصویر هست به این معنی که شبکه یاد میگیره پترن های خاص داخل تصویر رو تشخیص بده و هرجای دیگه پیدایش کنه.همشگت یک ضرب جز به جز است. مدل هر قسمت از تصویر رو اسکن می کنه عموما با ابعاد 3*3 و در فیلتری ضرب می کنه. خروجی یک نقشه ویژگی یا feature map میشه. این مراحل طی میشه تا تمام تصویر اسکن بشه و پس از همگشت اندازه تصویر نیز کاهش پیدا می کنه.همگشتبرخی از فیلتر ها رو در زیر ببینید:محاسبات همگشتبرای اینکه با جزییات بیشتر ببینید همگشت چجوری کار می کنه به تصویر زیر دقت کنید.Border effectتصویر 5*5 هست ولی فیلتر 3*3 اگه دقت کنید خانه وسط مربع فیلتر بر روی خانه اولی مربع تصویر هیچوقت قرار نمی گیره. حالا اگه بخواهیم این اتفاق بیفته کاری که می کنیم اطراف تصویر یک سطر و ستون عدد 0 قرار میدیم تا این اثر رو جبران کنیم. و این کار باعث میشه ابعاد تصویر ورودی و خروجی یکی بشه.وقتی شبکه رو می سازید ویژگی های تحت عمل همگشت به وسیله سه عامل کنترل میشه:عمق: بیان کننده تعداد فیلتر های اعمالی هست که در مثال قبلی عمق یک بود چون فقط یک فیلتر اعمال شد.اندازه جابه جایی: این معیار تعداد پیکسل هایی که هربار فیلتر بر روی آن ها جا به جا می شود رو تعیین می کنه. مثلا وقتی یک هست در هر مرحله فقط یک خانه جلو میره و اگه ۲ باشه هر مرحله ۲ خانه جلو میره. هرچی stride بیشتر باشه نقشه ویژگی ها کوچکتر میشه. stride = 1stride = 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.orgguru99.com