سلام
تو آموزش شبکه های کانولوشن بخش سوم اومده این مساله . فرقی هم برای کفی یا بقیه نداره .
بطور ساده خیلی راحت از اندازه کرنل 1 برای لایه کانولوشنتون استفاده کنید!
اما اگر قراره در یک معماری معادل لایه fc رو بیارید روی کانولوشن بطریقی که تو بخش سوم اومده عمل کنید یعنی :
تبدیل لایه های تماما متصل به لایه های کانولوشنی Converting Fully connected layers to convolutional layers))
ذکر این نکته حائز اهمیت است که تنها تفاوت بین یک لایه تماما متصل و کانولوشنی این است که نورون ها در لایه کانولوشن تنها به یک ناحیه محلی از ورودی متصل هستند و پارامترها را با یکدیگر به اشتراک میگذارند. البته نورونها در هر دو لایه ضرب نقطه ای را انجام میدهند بنابر این شکل عملکردی (functional form) آنها یکسان بوده و همانطور که در ادامه خواهید دید تبدیل این دولایه به یکدیگر کاملا ممکن و عملی است.
به ازای هر لایه کانولوشن لایه تماما متصلی وجود دارد که دقیقا همان تابع forward را پیاده سازی میکند. ماتریس وزن در این حالت ماتریس بزرگی خواهد بود که تمام درایه های آن به غیر از بلوکهای خاصی (بواسطه اتصال محلی) که وزنها در بسیاری از آنها با یکدیگر برابر اند (بواسطه اشتراک پارامتر) صفر است.
به همین شکل میتوان هر لایه تماما متصل را به یک لایه کانولوشن تبدیل کرد . به عنوان مثال یک لایه تماما متصل با K = 4096 فیلتر که به توده ورودی ای با اندازه ۷x7x512 نگاه میکند را میتوان بصورت یک لایه کانولوشنی با ناحیه ادراکی با اندازه F=7 , P=0 zero padding , S=1 گام یا stride و K=4096 فیلتر ایجاد کرد . به عبارت دیگر در اینجا ما اندازه فیلتر(ناحیه ادراکی) را دقیقا برابر با اندازه توده ورودی قرار میدهیم و اینطور اندازه خروجی برابر با ۱x1x4096 میشود چرا که تنها یک ستون عمقی را میتوان در توده ورودی جای داد که این دقیقا باعث نتایج یکسان با لایه تماما متصل اولیه میشود.
تبدیل لایه تمام متصل به لایه کانولوشنی (FC>CONV conversion)
از بین این دو تبدیل, تبدیل لایه تماما متصل به لایه کانولشنی در عمل مفیدتر است . بعنوان مثال یک معماری شبکه کانولوشن را در نظر بگیرید که یک تصویر با اندازه ۲۲۴x224x3 را بعنوان ورودی دریافت میکند و سپس از مجموعه ای از لایه های کانولوشنی و Pooling جهت کاهش اندازه تصویر به اندازه ۷x7x512 استفاده میکند (در معماری Alexnet که در ادامه با آن آشنا میشوید, این عمل توسط ۵ لایه Pooling که اندازه ورودی را با فاکتور ۲ هر بار کاهش داده تا آنکه آنرا به اندازه ۲۲۴/۲/۲/۲/۲/۲ =۷ برساند, انجام میشود ). در ادامه AlexNet از ۲ لایه تماما متصل با اندازه ۴۰۹۶ استفاده کرده و سپس در لایه تماما متصل آخر با ۱۰۰۰ نورون امتیاز دسته ها (class scores) را حساب میکند. ما با توجه به نکات گفته شده در بالا میتوانیم این شبکه های تماما متصل را به شبکه کانولوشنی معادل آنها تبدیل میکنیم . برای این کار بصورت زیر عمل میکنیم :
اولین لایه تماما متصل را که به توده ای با اندازه ۷x7x512 نگاه میکند با یک لایه کانولوشنی که از فیلتر با اندازه F=7 استفاده میکند تعویض میکنیم تا توده خروجی با اندازه ۱x1x4096 بدست بیاید.
لایه تماما متصل دوم را با یک لایه کانولوشنی که از فیلتر با اندازه F=1 استفاده میکند عوض میکنیم تا توده خروجی با اندازه ۱x1x4096 را بدست بیاوریم.
نهایتا آخرین لایه کانولوشن را مثل مرحله قبل با یک لایه کانولوشنی که از فیلتر با اندازه F=1 استفاده میکند تعویض میکنیم تا خروجی نهایی ۱x1x1000 حاصل شود.
هر کدام از این تبدیلات لایه تماما متصل به لایه کانولوشنی در عمل ممکن است نیازمند تغییراتی (نظیر تغییر شکل / تغییر ابعاد) در ماتریس وزن W باشد. در ادامه مشخص میشود که این تبدیل به ما اجازه میدهد تا در یک forward pass بصورت بسیار بهینه ای موقعیت های مکانی زیادی را در تصاویر بزرگتر پیمایش کنیم.
به عنوان مثال اگر تصویری با اندازه ۲۲۴×۲۲۴ توده ای با اندازه ۷x7x512 نتیجه دهد , این به معنای کاهش ۳۲ برابری است , بنابر این forwarding یک تصویر ۳۸۴×۳۸۴ پیکسلی در یک معماری تبدیل شده , همان توده را با اندازه ۱۲x12x512 نتیجه خواهد داد .چرا که ۳۸۴/۳۲=۱۲ . با گذشت از ۳ لایه کانولوشنی بعدی که ما تازه از لایه تماما متصل تبدیل کرده ایم توده نهایی با اندازه ۶x6x1000 نتیجه خواهد شد چرا که (۱۲ – ۷)/۱ + ۱ = ۶ میشود. توجه کنید که بجای یک بردار حاوی امتیاز کلاسها با اندازه ۱x1x1000 , ما حالا یک آرایه ۶×۶ کامل از امتیاز کلاسها از تصویر ۳۸۴×۳۸۴ پیکسلی را بدست می آوریم .