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


یکی از وظایف پایه در مبحث بینایی ماشین Image Classification می باشد. در ادامه با چالش های عکس در این زمینه آشنا می شوید.

Semantic gap : همان گسستگی میان پیکسل ها که حاوی این نکته است که ما فقفط بخشی از تصویر واقعی را در اختیار داریم.

viewpoint variation : یکی دیگر از چالش ها، اختلاف بین زاویه های مختلف یک شیء می باشد.

Illumination : نورپردازی های مختف کار تشخیص شیء را دچار چالش می کند.

Deformation : حالت های مختلف یک شیء و تغییر حالت آن از دیگر مشکلات این فیلد می باشد.

Occlusion : ناقص بودن یک شیء ممکن است مدل را برای تشخیص دچار مشکل کند.

Background clutter : هم شکلی با محیط کار تشخیص شیء از محیط را دشوار تر می کند.

Intraclass variation : تنوع یک دسته شیء هم از دیگر چالش های این حوزه محسوب می شود.

یکی از مشکلات تشخیص شیء عدم وجود هیچ الگوریتم مشخصی برای شناسایی شکل است، این فرآیند از همچین الگویی ثابت پیروی نمی کند.

 

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

  • Collect a dataset of images and labels (جمع آوری عکس ها و لیبل ها)
  • Use Machine Learning to train an image classifier (آموزش مدل)
  • Evaluate the classifier on a withheld set of test images (ارزیابی مدل)

یک مدل ساده بر روی دیتاست هدی

طبقه بند چند لایه softmax

 

تعیین تابع هزینه و روش بهینه سازی

 

تعیین داده‌های آموزشی، سایز mini-batch و تعداد epoch

 

نکته : مدل ساخته شده بعد از مدتی (چندبار دیدن عکس ها) شروع به حفظ دیتاست و ساخت توابع پیچیده میکند که باعث ایجاد مشکلی به نام overfitting می شود.


شبکه های کانولوشنی

تا قبل از سال 2012 تصور بر این بود که تعداد لایه های درونی را نباید بیش از 2 تا نشود که میزان خطا بالاتر تر نرود این بدلیل استفاده از تابع activation ناکارآمد sigmoid بود که با معرفی و استفاده از تابع ReLu و بالاتر رفتن تعداد لایه ها میزان خطا کمتر شد.

ایده ایجاد شبکه های کانولوشنی

در ماشین لرنینگ سنتی زمانی که از فیلتر ها استفاده می کردند با این چالش روبرو بودند که از چه فیلتری و با چه مقادیری استفاده کنند (مثلا کدام فیلتر لبه یاب بهتر است) تا این که این ایده ایجاد شد که خود مدل ، این فیلتر را طراحی کند. در شبکه های کانوولوشنی مقادیر این فیلتر ها را نیز بر عهده ی خود شبکه گذاشتند تا train شود.

Padding

لبه ها به اندازه پیکسل های درونی در کانولوشن شرکت نمی کنند درنتیجه خروجی کوچک می شود ( اگر تعداد لایه های کانولوشنی زیاد باشد حجم زیادی از دیتا از بین میرود )

با اضافه کردن مقادیری در اطراف عکس ورودی سعی در شرکت بیشتر لبه ها در این عمل داریم که به آن padding می گویند.

اگر در اطراف عکس مقدار 0 گذاشته شود zero-padding انجام داده ایم.

 

انواع کانولوشن

Valid : اگر از سایز ورودی با سایز خروجی برابر نباشد در حقیقت کانولوشن valid انجام داده ایم (اگر ورودی n*n و سایز فیلتر f*f باشد خروجی (n-f+1)*( n-f+1) می شود

Same : اگر به مقداری padding بدهیم که سایز ورودی با سایز خروجی یکی شود کاولوشن same خواهد بود) اگر ورودی n*n و سایز فیلتر f*f باشد و به اندازه p واحد padding بدهیم خروجی (n+2p-f+1)*( n+2p-f+1)  یا همان n*n می شود.

* نکته: برای اینکه کانولوشن same شود باید به اندازه 2/(f-1) به عکس ورودی padding بدهیم

* نکته: سایز فیلتر باید فرد در فرد باشد

Stride : مقدار جابجایی فیلتر به صورت افقی (چندتا چندتا جلو بره)

نکته : اگر ورودی n*n و سایز فیلتر f*f باشد و به اندازه p واحد padding بدهیم و stride s داشته باشیم خروجی

[( n+2p-f)/s+1]*[( n+2p-f)/s+1]   می شود(اگر عدد رند نشد به سمت پایین گرد میکنیم)

parameter : پارامتری که در فرایند training مشخص می شود و تابع cost بر اساس آن بهینه می شود ( مانند وزن های شبکه)

Hyper parameter : پارامتری که با فرآیند training بدست نمی آید ( مانند k در k nearest neighbor، مقدار stride)

 

کانولوشن چند بعدی

در این نوع کانولوشن باید بعد هم عمق با ورودی باشد یعنی اگر ورودی 6*6*3(یک عکس RGB 6*6) باشد، فیلتر میتواند 3*3*3 باشد.

 

 

* نکته: در این مثال از یک فیلتر استفاده کردیم پس بعد سوم خروجی 1 است یعنی خروجی 1*4*4 است (بعد خروجی = تعداد فیلتر استفاده شده)

* نکته: مقادیر مرکزی کانولوشن هر بعد با هم جمع می شود و bias نیز به آن اضافه می شود

** مثال: با 10 فیلتر 3*3*3 تعداد پارامتر آن لایه چقدر می شود؟   ((3*3*3)+1)*10 = 280

 

** مثال:


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

همان طور که مشاهده می کنید قبل از اولین لایه Dense یا fully connected همیشه از متد flatten استفاده میشود تا نرون ها به صورت یک وکتور در بیایند.

در لایه آخر نیز اگر خروجی مدل ما باینری باشد میتوان از activation=sigmoidاستفاده کرد اما اگر خروجی مدل چند حالت مختلف باشد مثل مدل بالا که برای هدی هست و 10 تا خروجی دارد از softmax استفاده شده.

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

تصاویر مجموعه داده هدی در تابعی که قبلا نوشته ایم، load_hoda به صورت flat شده و یک وکتور در آمده اند.
در این فراخوانی طول و عرض تصاویر 28 قرار داده شده است، پس خروجی این تابع وکتورهای 784 تایی است.
دقت کنید که قبل از ورودی شبکه کانولوشنالی تصویر را به شکل اصلی خود یعنی 28×28 برگردانده ایم.
همچنین چون تصاویر سیاه و سفید است تعداد کانال تصویر را 1 قرار داده ایم.

 

با دستور ()model.summary ورودی و خروجی هر لایه را میبینیم :

همانطور که مشاهده میکنید با هر بار conv گرفتن پارامتر های جدیدی به دست می آید که میتوانند با تابع cost بهینه شوند.

لایه dropout هم هر بار تعدادی از نرون ها را میکشد برای جلوگیری از پدیده overfitting .

و با هر بار pooling همان طور که مشاهده میکنید پارامتری برای آموزش نمی دهد و تنها دو هایپر پارامتر s و f دارد و تنها ابعاد داده را کوچکتر میکند با ازبین بردن برخی جزییات از طرق ماکسیمم گیری،میانگین گیری و ….

فوتر سایت

اسلایدر سایدبار

درباره ما

درباره ما

ما گروهی از دانشجویان رشته کامپیوتر دانشگاه شهید رجایی هستیم که به راهنمایی و تدریس استاد علی‌رضا اخوان‌پور به دنیای یادگیری عمیق پا گذاشتیم و دوست داریم چیزهایی که در این مسیر یادمی‌گیریم رو به اشتراک بذاریم.

شبکه های اجتماعی

مطالب اخیر