به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

+1 امتیاز

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

توسط (215 امتیاز)

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام
تو آموزش شبکه های کانولوشن بخش سوم اومده این مساله . فرقی هم برای کفی یا بقیه نداره .
بطور ساده خیلی راحت از اندازه کرنل 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 , ما حالا یک آرایه ۶×۶ کامل از امتیاز کلاسها از تصویر ۳۸۴×۳۸۴ پیکسلی را بدست می آوریم .

توسط (4.3k امتیاز)
انتخاب شده توسط
سلام....سید جان ممکنه منو راهنمایی کنی..دستت درد نکنه...من سعی کردم در معماری الکس نت بجای لایه های fc از conv ‌استفاده کنم...اما ارور دریافت میکنم...(اسم لایه ها رو تغییر ندادم و همون به صورت dc6 fc7 fc8 هستش)...
https://pastebin.com/nmHmaWWj
سلام . اون قضیه معادل سازی مربوط به وقتیه که بخوایی از صفر آموزش بدی . نه اینکه تغییر بدیو باز از فاین تون استفاده کنی .
سلام...سید جان من فاین تیون نکردم ، از صفر شبکمو آموزش میدم...
اگه به توده قبل از لایه fc6 ت نگاه کنی میبینی توده ورودی ات 6در6 هست اما اندازه کرنلت 7در7! خطایی که میگیری بخاطر اینه .
خطا در تبدیل لایه تماما متصل به لایه کانولوشنی
...