شبکه‌ی عصبی کانولوشنی (CNN) چیست؟ از آنجا که استفاده از شبکه‌های عصبی تمام‌متصل (Fully connected) عمیق به قدرت محاسباتی (حافظه) بالایی نیاز دارد تا بتوان تعداد زیادی وزن و ضرب ماتریسی سنگین را مدیریت کرد، نوع جدیدی از شبکه‌های عصبی به‌نام شبکه‌ی عصبی کانولوشنی (Convolutional Neural Network) معرفی شد. در میان شبکه‌های عصبی، شبکه‌ی عصبی کانولوشنی یکی از بهترین‌ها برای حل مسائل حوزه‌ی بینایی ماشین (Computer Vision)، مانند شناسایی تصاویر (Image Detection)، طبقه‌بندی تصاویر (Image Classification)، تشخیص چهره (Face Recognition) و غیره، است. در این مطلب قصد داریم این شبکه‌ی بسیار پرکاربرد، یعنی شبکه عصبی کانولوشنی (CNN)، را توضیح دهیم.

آیا کامپیوتر هم عکس‌ها را مانند انسان می‌بیند؟

در طبقه‌بندی تصاویر شبکه‌ی CNN عکسی را به‌عنوان ورودی دریافت می‌کند، آن را تجزیه‌وتحلیل  و در گروه‌های خاصی، برای مثال، سگ، گربه، ببر، شیر و غیره، طبقه‌بندی می‌کند، اما نکته‌ی مهم این است که کامپیوتر عکس را به‌شکلی نمی‌بیند که ما می‌بینیم. کامپیوتر عکس ورودی را به‌شکل آرایه‌ای از پیکسل‌ها می‌بیند. درواقع کامپیوتر آرایه‌ای به‌شکل h×w×d می‌بیند که در آن h همان طول تصویر، w عرض تصویر و d ابعاد تصویر است؛ برای مثال، یک عکس با آرایه‌ی ۳×۴×۴ به‌این معناست که طول و عرض آن ۴ پیکسل و تعداد کانال رنگ آن ۳ است (RGB) که در این شکل می‌توان آن را مشاهده کرد:

آرایه‌‌ی h×w×d در شبکه‌ی عصبی کانولوشنی (CNN)

همچنین عکسی با آرایه‌ی ۱×۶×۶ طول و عرض ۶ پیکسل و ۱ کانال رنگ دارد؛ به‌این معنا که عکس سیاه‌وسفید است، نه رنگی. هر یک از پیکسل‌ها مقداری میان صفر تا ۲۵۵ دارند که درواقع این مقادیر شدت هر پیکسل را نشان می‌دهد؛ برای مثال، در یک عکس سیاه‌وسفید عدد صفر نشان‌دهنده‌ی رنگ سیاه و عدد ۲۵۵ نشان‌دهنده‌ی رنگ سفید است؛ اعداد میان این دو، هر قدر به صفر نزدیک‌تر باشند، تیره‌تر هستند و برعکس. در این تصویر عکس سمت چپ چیزی است که ما می‌بینیم و عکس سمت راست چیزی است که کامپیوتر می‌بیند:

تفاوت دید عکس برای ما و کامپیوتر

برای آشنایی با فرایند تشخیص چهره این مطلب را مطالعه کنید:

تشخیص چهره (Face Recognition) چیست و چطور کار می‌کند؟

ساختار شبکه‌ی عصبی کانولوشنی (CNN)

یک شبکه‌ی CNN از دو بخش کلی تشکیل شده است:

  • استخراج ویژگی (Feature Extraction)
  • طبقه‌بندی (Classification)

درواقع زمانی‌که یک عکس به یک شبکه‌ی CNN وارد می‌شود، ابتدا به مرحله‌ی استخراج ویژگی وارد می‌شود. در این مرحله هر عکس ورودی از چندین سری لایه‌ی کانولوشن (Convolution) و تابع فعال‌ساز ReLU و لایه‌ی pooling عبور می‌کند. سپس عکس‌های ورودی به طبقه‌بندی وارد می‌شوند؛ در این مرحله ابتدا مسطح‌سازی (Flattening) صورت می‌گیرد و سپس به یک لایه‌ی Fully Connected وارد می‌شوند و درنهایت یک تابع سافت مکس (Softmax) برای مسائل طبقه‌بندی چندکلاسه و یا تابع سیگموید (Sigmoid) برای مسائل طبقه‌بندی باینری روی آن اعمال می‌شود تا عکس‌ها براساس مقادیر احتمالی میان صفر و یک طبقه‌بندی شوند.

در این شکل می‌توانیم این فرایند را مشاهده کنیم:

مراحل ساختار شبکه‌ی عصبی کانولوشنی (CNN)

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

مرحله‌ی اول: استخراج ویژگی (Feature Extraction)؛ لایه‌ی کانولوشن (Convolution)

این لایه اولین گام در استخراج ویژگی عکس ورودی است. در لایه‌ی کانولوشن، شبکه با استفاده از فیلترها (filter / kernel) که ماتریس‌هایی کوچک (معمولاً ۳×۳) هستند، ویژگی‌های (feature) عکس را یاد می‌گیرد؛ اما این کار به چه شکلی انجام می‌شود؟

همان‌طور که گفتیم، کامپیوتر هر عکس ورودی را به‌شکل ماتریسی از پیکسل‌ها می‌بیند که هر یک از این پیکسل‌ها مقداری بین صفر تا ۲۵۵ دارند؛ برای مثال، یک عکس ۵×۵ پیکسلی را در نظر می‌گیریم که در اینجا برای راحتی و درک بهتر مقدار هر پیکسل، به‌جای صفر تا ۲۵۵، صفر یا یک است. این عکس ورودی ماست که در این شکل نمایی از ماتریس آن را مشاهده می‌کنیم:

ماتریس عکس ورودی

در لایه‌ی کانولوشن مقدار پیکسل‌های ماتریس عکس ورودی در یک فیلتر ضرب می‌شود. فیلتر یک ماتریس است که ممکن است مقادیر مختلفی داشته باشد.

هم‌چنین فیلترها در اندازه‌های مختلفی وجود دارند که در این شکل مشخص شده است:

اندازه‌های فیلترها

حال فرض می‌کنیم برای استخراج ویژگی‌های عکس ورودی که ۵×۵ است، یک فیلتر ۳×۳ به‌این شکل داریم:

فیلتر ۳×۳

حال این فیلتر مثل یک پنجره‌ی کوچک روی عکس ورودی قرار می‌گیرد و به‌عبارت دیگر، می‌توانیم بگوییم این فیلتر با عکس ورودی ادغام (Convolve) می‌شود. این فیلتر روی هر بخش از عکس ورودی که قرار می‌گیرد مقدار هر پیکسل آن با مقدار پیکسل متناظرش در ماتریس عکس ورودی ضرب می‌شود؛ حاصل‌جمع ضرب تمامی پیکسل‌ها با پیکسل‌های متناظرشان ماتریس جدیدی را ایجاد می‌کند که به آن Convolved Layer / Convolutional Feature / Feature map / Filter map گفته می‌شود. در این شکل می‌توانید این فرایند را مشاهده کنید:

نحوه‌ی محاسبه‌ی پیکسل‌ها در شبکه‌ی عصبی کانولوشنی (CNN)

ممکن است با خود فکر کنیم این فیلتر هر بار باید چند پیکسل روی ماتریس عکس ورودی حرکت کند؟

پاسخ این سؤال در مفهوم گام (Stride) است.

(Stride) گام

گام یا Stride تعداد پیکسل‌هایی است که فیلتر روی ماتریس ورودی حرکت می‌کند. زمانی‌که مقدار Stride را ۱ در نظر بگیریم، یعنی فیلتر هر بار ۱ پیکسل حرکت می‌کند و اگر ۲ در نظر بگیریم، یعنی فیلتر هر بار ۲ پیکسل حرکت می‌کند. در این شکل می‌توانیم ببینیم فیلتر با مقدار Stride =۲ چطور حرکت می‌کند:

حرکت فیلتر با مقدار Stride =۲

اما مسئله‌ی بعدی این است که اگر برای مثال ماتریس عکس ورودی ما ۹×۹ باشد و فیلتر ما ۲×۲ باشد، در این صورت با Stride =۱ فیلتر درنهایت به جایی می‌رسد که یک پیکسل بیشتر از تعداد پیکسل‌های ماتریس ورودی دارد. در این مواقع که فیلتر با ماتریس عکس ورودی متناسب (fit) نیست چه کاری می‌توانیم انجام دهیم؟

در این مواقع از Padding استفاده می‌کنیم.

Padding

در تکنیک Padding به ماتریس عکس ورودی صفر اضافه کنیم که به آن Zero-Padding گفته می‌شود. معمولاً مقدار Padding را ۱ در نظر می‌گیریم که در این شکل نمایش داده شده است:

Padding

برای آشنایی با فرایند لایه‌گذاری (Padding) در شبکه عصبی کانولوشنی این مطلب را مطالعه کنید:

فرایند لایه‌گذاری (Padding) در شبکه عصبی کانولوشنی چیست؟

تابع فعال‌ساز ReLU (Rectified Linear Unit)

تا اینجا با لایه‌ی کانولوشن و نحوه‌ی کار آن آشنا شدیم. در مرحله‌ی استخراج ویژگی بعد از هر لایه‌ی کانولوشن یک تابع فعال‌ساز (معمولاً تابع ReLU) اعمال می‌شود.

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

تابع فعال‌ساز ReLU

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

اما به چه دلیل از تابع فعال‌ساز استفاده می‌کنیم؟

زیرا می‌خواهیم در خروجی اعداد مثبت غیرخطی را داشته باشیم. در دنیای واقعی داده‌های ما مثبت و غیرخطی هستند و از آنجا که عمل کانولوشن یک عمل خطی است، لازم است خروجی آن را غیرخطی کنیم؛ این همان کاری است که توابع فعال‌ساز غیرخطی، مانند ReLU، انجام می‌دهند.

تابع فعال‌ساز غیرخطی

لایه‌ی Pooling

گام بعدی در مرحله استخراج ویژگی لایه‌ی Pooling است. در این مرحله هدف این است که ابعاد عکس ورودی را کاهش دهیم و فقط اطلاعات یا پیکسل‌های مهم را نگه داریم و باقی را حذف کنیم. زمانی‌که عکس ورودی اندازه‌ی بسیار بزرگی دارد، می‌توانیم با این کار اندازه‌ی آن را تا حد زیادی کاهش دهیم. به این کار Downsampling یا Subsampling هم گفته می‌شود.

 Pooling انواع مختلفی دارد:

  • Max Pooling
  • Average Pooling
  • Sum Pooling

در بیشتر مواقع در شبکه‌ی عصبی کانولوشنی (CNN) از Max Pooling استفاده می‌شود. در Max Pooling پیکسلی که مقدار بزرگتری در مقایسه با باقی دارد در Average Pooling مقدار میانگین و در Sum Pooling جمع تمامی مقادیر در هر Feature Map انتخاب می‌شود. این شکل عملیات Max Pooling را نشان می‌دهد:

عملیات Max Pooling

در اینجا مرحله‌ی اول، یعنی استخراج ویژگی، به پایان می‌رسد.
برای آشنایی بیشتر با لایه ادغام (Pooling Layer) در شبکه عصبی کانولوشنی (CNN) این مطلب را مطالعه کنید:

لایه ادغام (Pooling Layer) در شبکه عصبی کانولوشنی (CNN) چیست؟

مرحله‌ی دوم شبکه‌ی عصبی کانولوشنی (CNN): طبقه‌بندی (Classification)

همان‌طور که قبلاً اشاره کردیم، در این مرحله از شبکه‌ی عصبی کانولوشنی (CNN) ابتدا مسطح‌سازی (Flattening) صورت می‌گیرد. به‌این معنا که ماتریس خروجی از مرحله‌ی اول (استخراج ویژگی) باید به یک بردار تبدیل شود؛ یعنی اگر ماتریس ما ۳۰×۳۰ باشد، به یک بردار یا آرایه ۹۰۰تایی تبدیل می‌شود.

سپس این بردار به یک لایه‌ی Fully Connected وارد می‌شود. یک لایه‌ی Fully Connected درواقع یک پرسپترون چندلایه (MLP / Multi Layer Perceptron) است که در آن تمامی نودهای لایه‌ی قبلی به تمامی نودهای لایه‌ی بعدی متصل هستند. هدف از استفاده از لایه‌ی Fully Connected این است که با توجه به ویژگی‌هایی که از مرحله‌ی اول دریافت کرده‌ایم، عکس‌های ورودی را در کلاس‌های متفاوت طبقه‌بندی کنیم. درنهایت، یک تابع سافت‌مکس (Softmax) روی آن اعمال می‌شود تا احتمال تعلق‌داشتن عکس ورودی به هر کلاس (مثلاً گربه، سگ و غیره) در خروجی مشخص شود. جمع کل خروجی‌های لایه‌ی Fully Connected برابر با ۱ است. در این شکل تصویر یک لایه‌ی Fully Connected را مشاهده می‌کنیم که ورودی آن بردار …,x1,x2,x3 است.

لایه‌ی Fully Connected در شبکه‌ی عصبی کانولوشنی (CNN)

برای آشنایی با شبکه عصبی بازگشتی این مطلب را مطالعه کنید:

شبکه عصبی بازگشتی (RNN) چیست و چه کاربردهایی دارد؟

یادگیری دیتا ساینس و ماشین لرنینگ با کلاس‌های آنلاین آموزش علم داده کافه‌تدریس

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

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

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

کلاس‌های آنلاین علم داده کافه‌تدریس

هفت‌خوان: مطالعه کن، نظر بده، جایزه بگیر!

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

جوایز هفت‌خوان

  • ۱,۵۰۰,۰۰۰ تومان جایزه نقدی
  • ۳ کلاس رایگان ۵۰۰,۰۰۰ تومانی

پرسش‌های مسابقه

برای شرکت در هفت‌خوان کافه‌تدریس در کامنت همین مطلب به این پرسش‌ها پاسخ دهید:

  • شبکه‌ی عصبی کانولوشنی (CNN) چگونه تصاویر را برای استخراج ویژگی‌ها تجزیه و تحلیل می‌کند؟
  • لایه‌ی کانولوشن در CNN چه نقشی دارد و چگونه به کمک Stride و Padding به استخراج ویژگی‌ها کمک می‌کند؟
  • تابع فعال‌ساز ReLU در فرآیند یادگیری شبکه‌ی عصبی کانولوشنی چه کارکردی دارد و چرا در لایه‌ی Pooling از آن استفاده می‌شود؟

هفت‌خوان‌پلاس

برای بالابردن شانس‌تان می‌توانید این مطلب را هم مطالعه کنید و به پرسش‌های آن پاسخ دهید:

قدرت شبکه عصبی کانولوشنال چقدر است؟