بسم الله الرحمن الرحیم
لایه های تماما متصل میتونن ویژگی های بیشتری رو یاد بگیرن
از طرف دیگه چون تعداد پارامترها در این نوع لایه ها خیلی زیاد هست اخیرا سعی کردن این لایه ها رو تبدیل به معادل کانولوشن اونها کنن تا محاسبه و فضای مصرفی بهینه بشه .
نکته دیگه اینکه امروزه دیگه مثل قبل از لایه نرمالیزاسیون! استفاده نمیشه بجاش از لایه بچ نورمالیزیشن استفاده میشه
علاوه بر اون تعریف یک معماری الان بر اساس قانون خاصی نیست . بیشتر یک هنره . و تست و تجربه .
نکته ای که طی این سالها بهش رسیدن اینه که هرچقدر شبکه شما عمیق تر باشه موفقیت شبکه شما هم بیشتره . اینم باید بدونید که هرچقدر عمق شبکه بیشتر باشه مشکلات اموزش اون خیلی خیلی بیشتر میشه .
حالا از طرف دیگه اینکه چرا همه اش از لایه های تماما متصل استفاده نمیشه و بخاطرش از لایه کانولوشن استفاده میشه بخاطر این هست که به غیر از بحثهای پردازشی و سربار زیاد این لایه ها اورفیتینگ زیادی رو هم بخاطر تعداد زیاد پارامترها باعث میشن و از طرف دیگه ماهیت 2 بعدی تصاویر در لایه کانولوشن بخوبی قابل استفاده اس.
برای همین برای اینکه بشه خصائیص غیر خطی بیشتری رو بدست اورد میان تعداد مختلفی از لایه های کانولوشن رو پشت سر هم قرار میدن و بعدش در لایه اخر از حداقل یه لایه تماما متصل برای دسته بندی استفاده میکنن .
این وسط برای ایجاد یک translation invariance و همینطور کاهش ابعاد در توده های موجود در شبکه میان از pooling استفاده میکنن
چون پولینگ هر بار کاهش ابعاد رو باعث میشه به همین خاطر اگر اندازه تصویر شما نسبتا کوچیک باشه زیاد و به کرار ازش استفاده نمیکنن بجاش سعی میکنن از طریق خود لایه کانولوشن با اندازه فیلتر بزرگتر و یا گام متفاوت تر کاهش ابعاد رو داشته باشن.
پس خط مشی کلی امروزه اینه سعی کنید تعدادی لایه کانولوشن پشت سر هم داشته باشید بعد بسته به اندازه تصویر سعی کنید بین اینها از pooling استفاده کنید (Max نشون داده که بعضا بهتر جواب میده اما شما بسته به کارتون ممکنه از توابع دیگه نتایج بهتری بگیرید) . بعد در لایه های اخر هم از لایه تماما متصل استفاده کنید .
البته تکنیک های جدیدی هم اومدن که با استفاده از اونها میتونید باعث بهتر شدن نتیجه بیشید (مثل استفاده از ELU وPrelu بجای Relu یا استفاده از dropout و dropconnect برای مقابله با اورفیتینگ و یا spatial pyramid pooling یا stochastic pooling (که این نمونه اخری رو من تست کردم نتیجه ام خیلی بد شد!) و...
در آخر هم باید بگم هرکدوم از این روشها و تکنیک هایی که معرفی میشن باید تست بشن و ممکنه شما یکی از این روشها رو تست کنید و نتیجه اتون بدتر بشه وقتی این اتفاق افتاد یا نیاز به تست بیشتر دارید یا در حالت شما اصلا نیازی به استفاده از اون ویژگی خاص نیست . مثلا من بدون stochastic pooling به دقت 99درصد در ام نیست رسیده بودم که وقتی فعالش کردم دقتم شد 43 درصد!
اینکه اندازه تعداد فیچرمپهای شبکه کانولوشن رو هم چقدر بگیریم این هم یه پارامتر هست و قائده خاصی نداره . چیزی که من میتونم بگم اینه که از کم شروع کنید بعد کم کم برید بالا. یه نکته خیلی مهم دیگه هم بخش optimiziation و مسائلی مثل انتخاب نرخ یادگیری و مومنتوم و... هست . ممکنه شما یک مدل /معماری خیلی خوب از لایه ها رو تعریف کنید و بعد فقط بخاطر درست انتخاب نکردن پارامترهای optimization نتایج بدی بگیرید . دوباره بعنوان نمونه من عینا همون معماری که با اون به دقت 99درصد رسیده بودم با تغییر پارامترهای بهینه سازی نتونستم بیشتر از 86درصد برم .
کاری که من شخصا میکنم اینه اول سعی میکنم با یه پیکربندی اولیه شروع کنم و انقدر با پارامترهای solver کار کنم تا مطمئن بشم بهترین نتیجه رو گرفتم بعد شروع میکنم تعداد لایه ها و یا خروجی اونها رو تغییر دادن و دوباره این مسیر رو ادامه میدم تا به نتیجه برسم .
البته این مربوط به زمانی هست که من بخوام بنا به دلایلی خاص از هیچ مدلی دیگه ای استفاده نکنم . ولی معمولا در 90 درصد اوقات اکثر محققا یک مدل مثل الکس نت یا گوگل نت یا Vggnet رو انتخاب میکنن و بعد شروع میکنن با تغییر دادن تو اوون از اون در کار مورد نظر خودشون استفاده کردن .
نکته دیگه ای هم در مورد انتخاب مدل حائز اهمیت هست مشخصات سخت افزاری مورد نیاز اونها هست که باید بهش دقت کنید.
در پناه حق موفق و سربلند باشید