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

با تشکر

دسته بندی ها

0 امتیاز

سلام عرض ادب
دوستان دلیل اینکه در شبکه ها از لایه های کانالوشن 3x3 و 1x1 بصورت stack استفاده میکنند چی هست ؟ یجایی دیدم اصولا 3x3 ها برای استخراج ویژگی بکار میرن و 1x1 ها برای کاهش سربار محاسباتی و کاهش عمق لایه قبل یعنی یجورایی که قبلا شیپ لایه قبل بصورت 14x14x512ود با اضافی کردن لایه 1x1 شده بود 14x14x256
اینکار چجوری صورت میگیره؟

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

2 پاسخ

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

سلام
علاوه بر توضیحاتی که Alister عزیز زحمتش رو کشید باید گفت که از این تکنیک عموما برای کاهش سربار پردازشی و تعداد پارامترهای قابل یادگیری استفاده میشه.
بعنوان مثال در تصویر زیر محاسبات مربوط به اعمال یک فیلتر (یک لایه) رو در حالت معمول شاهد هستیم. میبینیم ک همین عملیات ساده 153 هزار پارامتر و 120 میلیون عملیات اعشاری رو موجب میشه.

حالا با استفاده از یک لایه ۱در۱ ببینیم چقدر در سربار پردازشی و تعداد پارامترهای قابل یادگیری شاهد کاهش هستیم :‌

میبینیم با استفاده از این تکنیک تعداد پارامترهای قابل یادگیری کاهش بسیار چشم گیری داشتند از ۱۵۳ هزار به ۱۵ هزار پارامتر کاهش پیدا کردند. به همین شکل میبینیم که تعداد عملیات اعشاری مورد نیاز هم بشدت کاهش رو تجربه میکنه و از ۱۲۰ میلیون پارامتر به ۱۲ میلیون پارامتر میرسه.
وجود همچین مکانیزمی برای معماری های مبتنی بر NIN‌ مثل سری معماری های گوگل نت و انواع مختلف inception‌ یک ضرورت بحساب میاد چرا که بدون استفاده از تکنیک های اینچنینی استفاده عملی از اون معماری ها قابل تصور نیست یا حداقل به این صورت و فرم فعلی اونها. همچنین معماری های بسیار عمیقی مثل ResNet‌و نسخه های مبتنی بر اون هم نیازمند مکانیزمی جهت جلوگیری از افزایش شدید تعداد پارامتر با افزایش عمق هستند به همین دلیل در این نوع معماری ها هم از این دست تکنیک ها مشاهده میکنید.

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

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

Towards Principled Design of Deep Convolutional Networks

ضمنا اسم تکنیکی که بهش اشاره کردید به bottleneck معروف هست. در فایل پرزنتیشن به بخش رزنت مراجعه کنید باید توضیحاتی باشه.علاوه بر مقاله ای که علی آقای عزیز معرفی کردن مقاله inceptionv3 ‌یا rethinking inception‌ و همینطور مقاله resnet رو مطالعه کنید خوبه. علاوه بر اینها با توجه به عملیاتی که اینجا دیدید خودتون حالات دیگه رو تست کنید تا بیشتر پی ببرید چرا این تکنیک بیشتر مورد استفاده قرار میگیره.

توسط (4.3k امتیاز)
انتخاب شده توسط
ممنون از توضیحات خوبتون
آیا این تکنیک جدا از اینکه مزایایی داره معایب هم میتونه داشته باشه ؟
سوال بعدی اینکه چجوری FLOP ها حساب میشوند یعنی تعداد المان های فیلتر x تعداد المان های لایه خروجی چرا ؟
سلام. خیلی خلاصه بله. تو همون مقاله که لینکش رو دادم بطور مفصل بحث شده که تاثیرات ۱در۱ در معماری به چه صورتی هست. بطور خیلی خلاصه فیلتر ۱در۱ اطلاعات مهم لوکالیتی رو از بین میبره و علاوه بر اون هربار یک نگاشت جدیداز مرحله قبل ارایه میده قبل از اینکه اطلاعات قبلی بخوبی مورد پردازش قرار گرفته باشن این همگرایی رو در بهترین حالت کند میکنه و بطور ویژه در لایه های ابتدایی اگر استفاده بشه تاثیر سویی روی همگرایی شبکه و دقت نهایی میزاره.
در مورد فلاپس هم چیزی که من نوشتم در اصل تعداد ضرب هاست که ایده خوبی از میزان عملیات اعشاری میده و عمده اتفاقی که می افته همین ضربه. برای محاسبه کلی فلاپس میتونی به https://github.com/dgschwend/netscope نگاه بندازی )
+1 امتیاز

برای اینکه کانولوشن ۱×۱ رو درک کنید مطالعه مقاله :

Going Deeper with Convolutions

می‌تونه خیلی کمک کنه . این کانولوشن یک تکنیک "feature pooling" هستش به عبارت ساده یک پیکسل ورودی (بدون نگاه کردن به پیکسل های اطراف آن)با تمام کانال هاش رو به یک پیکسل خروجی نگاشت میده (میانگین گیری بر روی کانال ها ) .از این کانولوشن برای کاهش عمق کانال ها استفاده میشه .

فرض کنید یک لایه کانولوشن با خروجی زیر داریم

N اندازه batch
F تعداد فیلتر هوای کانولوشن
H,W ابعاد

این اطلاعات رو به لایه کانولوشن بعدی مون ( کانولوشن ۱×۱) با تعداد s فیلتر داده میدهیم ، خروجی ما بعد از اعمال عملیات کانولوشن به شکل زیر در خواهد آمد :

(N,s,h,w)

در صورتی که تعداد s(فیلتر ها) از F کمتر باشه باعث کاهش عمق داده ها ، در صورتی که این مقدار بیشتر باشه باعث افزایش عمق داده ها میشود. از این رو در بلاک inception با توجه به تعداد زیاد فیلتر های ۳×۳ و ۵×۵ که عمدتا عملیات طاقت فرسایی هستند ابتدا کانولوشن ۱×۱ اعمال میشود .(در inception از کانولوشن ۱×۱ برای کاهش ابعاد در فضای فیلتر استفاده میشه )

توسط (415 امتیاز)
در کانالوشن های دیگه مثله 3x3 , 5x5 نیز اگر تعداد کرنل ها از تعداد عمق لایه قبلی کمتر باشد نیز عمق لایه جدید نیز کمتر از لایه قبل خواهد شد.
...