آموزش شبکه کانولوشن بخش دوم
بسم الله الرحمن الرحیم
این بخش دوم آموزش شبکه های کانولوشن هست . تصاویر زیادی این اموزش داره خصوصا اخر و یکسری از فرمول ها رو هم مجبور شدم از word عکس بگیرم. حواستون باشه که اگه جایی چیزی باید باشه و نیست بدونید عکس لود نشده! انشاالله سرفرصت داکیومنت این هم برای دانلود قرار میدم.
لایه Convolutional
لایه کانولوشن هسته اصلی تشکیل دهنده شبکه عصبی کانولوشن است, و توده خروجی آن را میتوان بصورت یک توده سه بعدی از نورون ها تفسیر کرد. به زبان ساده تر یعنی اینکه خروجی این لایه یک توده سه بعدی است . برای درک بهتر این مسئله شبکه های عصبی معمولی را در نظر بگیرید . در شبکه های عصبی معمولی هر لایه چیزی جز لیستی(یک بعدی همانند یک مستطیل!) از نورون ها نبود که هر نورون خروجی خاص خود را تولید میکرد و نهایتا یک لیست از خروجی ها که متناظر با هر نورون بود حاصل میشد . اما در شبکه عصبی کانولوشن بجای یک لیست ساده ما با یک لیست سه بعدی (یک مکعب !) مواجه هستیم که نورونها در سه بعد آن مرتب شده اند. در نتیجه خروجی این مکعب نیز یک توده سه بعدی خواهد بود . تصاویر زیر این مفهوم و تفاوت بین این دو مفهوم را بهتر بیان میکند .

در اینجا ما در مورد جزییات اتصالات نورون ها و نحوه قرارگیری آنها در فضا و طرح اشتراک پارامتر آنها صحبت میکنیم .
خلاصه و درک شهودی مسئله :
پارامترهای لایه کانولوشن شامل مجموعه ای از فیلترهای قابل یادگیری هستند. هر فیلتر از لحاظ مکانی کوچک بوده [۱] اما در امتداد عمق توده ورودی ادامه پیدا میکند. به زبان ساده تر میتوان اینطور گفت که ما با یک توده سه بعدی مواجه هستیم . این توده سه بعدی دارای یک طول و عرض و یک عمق است. اگر فرض کنیم عمق ما برابر با x باشد به این معناست که ما x برش (قاچ) از توده خواهیم داشت. بعنوان مثال اگر عمق برابر با ۱ باشد ما با یک ماتریس ساده (آرایه دوبعدی) مواجه هستیم که دارای طول و عرض است . حال اگر عمق برابر با ۲ باشد یعنی ما دارای دو ماتریس هستیم . یعنی در هر عمق در اصل یک ماتریس وجود دارد. بنابر این زمانی که ما میگوییم فیلتر مورد نظر در امتداد یا راستای عمق ادامه میابد به این معناست که این فیلتر بر روی تمامی ماتریس ها (برش های توده ورودی ) اعمال میشود.
یک توده سه بعدی با عمق برابر با ۲ که بصورت عمودی برش داده شده است .
در زمان forward pass ما هر فیلتر را در امتداد پهنا (width) و ارتفاع (height) ورودی میلغزانیم (در اصل convolve میکنیم ) با این کار ما یک نگاشت فعال سازی(Activation Map) دو بعدی برای آن فیلتر ایجاد میکنیم. همانطور که ما فیلتر را در عرض ورودی میلغزانیم (slide میدهیم) ضرب نقطه ای بین ورودی های فیلتر با ورودی را هم انجام میدهیم . بصورت شهودی, شبکه, فیلترهایی که در زمان مشاهده برخی از ویژگی های خاص در بعضی موقعیتهای مکانی در ورودی فعال میشوند را یاد میگیرد . با انباشته کردن این نگاشتهای فعال سازی (Activation Maps) برای تمامی فیلترها در راستای بُعد عمق ,توده خروجی کامل بدست می آید . هر مدخل در این توده خروجی را میتوان بعنوان خروجی یک نورون که تنها به ناحیه کوچکی در ورودی نگاه میکند در نظر گرفت که پارامترهای مشترک با بقیه نورون ها در همان نگاشت فعال سازی (Activation Map)دارد(چرا که این اعداد همه نتیجه اعمال یک فیلتر یکسان هستند ).
اتصال محلی (Local Connectivity):
زمانی که ما با ورودی هایی با ابعاد بالا(high dimensional) مثل تصاویر مواجه هستیم[۲], همانطور که در بالا دیدیم اتصال نورون ها به تمام نورونهای قبل از خود (در توده قبلی) غیر عملی است. بنابر این بجای اینکار ما هر نورون را تنها به ناحیه کوچکی از توده ورودی متصل میکنیم .میزان وسعت این ناحیه کوچک برای اتصال یک فراپارامتر است که به آن receptive field و یا ناحیه ادراکی گفته میشود . وسعت اتصال در محور عمق همیشه مساوی با عمق توده ورودی است .توجه به این عدم تقارن در نحوه برخورد ما با ابعاد مکانی (طول و عرض تصویر و یا همان عرض و ارتفاع ) و بعد عمق حائز اهمیت است. ارتباطات در مکان محلی هستند یعنی در راستای عرض و ارتفاع تصویر هستند اما همیشه تمام عمق توده ورودی را در بر میگیرند. اجازه دهید با یک مثال توضیح بیشتری بدهیم . فرض کنید توده ورودی ما دارای اندازه ای برابر با ۳x32x32 باشد ( مثلا یک عکس رنگی (RGB) از دیتاست CIFAR-10 ). حال اگر ناحیه ادراکی (Receptive Field) اندازه ای برابر با ۵×۵ داشته باشد این به این معناست که هر نورون در لایه کانولوشن برای ناحیه ای در توده ورودی با اندازه ۵x5x3 تعداد وزنی برابر۵x5x3=75 خواهد داشت. لطفاً دقت کنید که میزان وسعت اتصال در امتداد محور عمق باید مساوی ۳ باشد چرا که عمق توده ورودی ما ۳ است ( تصویر ورودی ما دارای ۳ کانال رنگ است). پس همانطور که دقت کردید اتصالات فقط در راستای عرض و ارتفاع تصویر ورودی نیستند بلکه در محور عمق هم امتداد پیدا میکنند. و این به زبان ساده تر به این معناست که اگر تصویر رنگی ورودی خود با ۳ کانال رنگ را ۳ ماتریس که پشت سر هم قرار گرفته اند در نظر بگیریم . توضیحات بالا به این معناست که ما ناحیه ای به اندازه ۵×۵ را بر روی تمام این سه ماتریس اعمال میکنیم . تصویر زیر این مطلب را بهتر نشان میدهد.
نمایشی از ارتباط در یک توده که در راستای عرض و ارتفاع در امتداد عمق ادامه یافته است
مثال دوم را در نظر بگیرد. فرض کنید توده ورودی اندازه ای برابر با ۱۶x16x20 داشته باشد. بنابر این با استفاده از ناحیه ادراکی (Receptive field) با اندازه ۳×۳ هر نورون در لایه کانولوشن تعداد ۳x3x20 = 180 اتصال به توده ورودی خواهد داشت. توجه کنید که اتصال در فضا محلی است ( مثلا در اینجا ۳×۳ است ) اما تمام عمق را در بر گرفته است (۲۰)
تصویر سمت چپ یک توده ورودی را نشان میدهد که با رنگ قرمز مشخص شده است ( مثلا یک عکس با اندازه ۳x32x32 از دیتا ست CIFAR-10). همینطور شما میتوانید یک توده از نورون ها را در لایه کانولوشن که به رنگ آبی نمایش داده شده است مشاهده کنید. هر نورون در لایه کانولوشن تنها به یک ناحیه محلی از لحاظ مختصات مکانی( طول و عرض) در توده ورودی متصل است اما این ارتباط در عمق بصورت کامل امتداد میابد(یعنی تمام کانال های رنگ را در بر میگیرد).توجه کنید که چندین نورون ( در این مثال ۵ نورون ) در راستای عمق وجود دارند که همگی به یک ناحیه در ورودی نگاه میکنند(توضیحات ببیشتر در ادامه داده میشود).
تصویر سمت راست ساختار یک نورون را نشان میدهد که دقیقا همانند چیزی است که در شبکه های عصبی معمولی مورد استفاده قرار میگیرد بعبارت دیگر نورون ها هیچ تفاوتی نسبت به قبل نکرده اند. آنها هنوز ضرب نقطه ای بین وزنها و ورودی ها را انجام داده و نتیجه را از یک تابع غیرخطی عبور میدهند و خروجی را تولید میکنند. تنها تفاوت در اینجا این است که اتصال دستخوش محدودیت شده است به این معنا که اتصالات آنها باید از لحاظ مکانی محلی باشد
ما تا به اینجا در مورد اتصال هر نورون به توده ورودی در لایه کانولوشن صحبت کردیم اما چیزی در مورد اینکه چه تعداد نورون در توده خروجی بایستی وجود داشته باشند و یا اینکه ترتیب قرار گیری آنها به چه صورت باید باشد صحبتی نکردیم.۳ فراپارامتر (Hyper parameter) اندازه توده خروجی را کنترل میکنند. این سه پارامتر عمق (depth) ,گام (stride) و لایه گذاری با صفر (zero-padding) هستند. در زیر به توضیح بیشتر این پارامترها میپردازیم.
عمق توده خروجی پارامتری است که ما میتوانیم خود انتخاب کنیم . این پارامتر تعداد نورون هایی که در لایه کانولوشن به یک ناحیه در توده ورودی متصل میشوند را کنترل میکند. این پارامتر همانند حالتی در شبکه های عصبی معمولی است که ما در یک لایه مخفی چندین نورون داشتیم که همه به یک ورودی متصل بودند. همانطور که جلوتر خواهیم دید تمام این نورون ها یاد میگیرند که برای ویژگی های مختلف موجود در ورودی فعال شوند. بعنوان مثال اگر لایه کانولوشن اول یک تصویر خام را بعنوان ورودی دریافت کند, نورون هایی که در امتداد بعد عمق قرار دارند ممکن است با مواجهه با لبه های جهتدار (oriented edges) و یا لکه های رنگ (blobs of color) فعال شوند. ما به مجموعه نورون هایی که همه به یک ناحیه یکسان از ورودی نگاه میکنند یک ستون عمقی یا depth column میگوییم.
ما باید گام (stride) را که بوسیله آن ستون های عمقی (depth column) را حول ابعاد مکانی (عرض و ارتفاع) معین میکنیم مشخص کنیم. زمانی که stride برابر با ۱ باشد ما یک ستون عمقی (depth column) جدید از نورون ها را به مختصات مکانی با فاصله تنها ۱ واحد مکانی از هم, اختصاص میدهیم. این باعث بوجود آمدن نواحی ادراکی دارای اشتراک زیاد بین ستونها و همچنین توده های خروجی بزرگ میشود. برعکس اگر ما گام ها (stride) را بزرگتر بگیریم نواحی ادراکی اشتراک کمتری داشته و توده خروجی نیز از لحاظ ابعاد مکانی کوچکتر میشود.
همانطور که بزودی خواهیم دید بعضی اوقات راحت تر است که مرز توده ورودی را با صفر بپوشانید(zero-pad) . به عبارت دیگر یعنی دور تصویر ورودی را با صفر پر کنیم . مثل اینکه یک سطر ۰ و یک ستون ۰ به ابتدا و انتهای تصویر اضافه کنیم اینطور تصویر ما در داخل قابی از صفر قرار خواهد گرفت مثل شکل زیر:
اندازه این Zero-padding یک فراپارامتر(hyper parameter) است . ویژگی خوب این پارامتر این است که بما اجازه کنترل کردن اندازه توده خروجی را میدهد. بطور خاص ما بعضی اوقات میخواهیم که دقیقا اندازه مکانی توده ورودی حفظ شود.
ما برای محاسبه اندازه (مکانی) توده خروجی میتوانیم از اندازه توده ورودی (W) اندازه ناحیه ادراکی نورون های لایه کانولوشن (F) , اندازه گام (stride) و مقدار zero padding که روی مرزهای توده ورودی اعمال شده استفاده کنیم . ما میتوانیم از فرمول:
برای محاسبه اینکه چه تعداد نورون مناسب است استفاده کنیم (با تست این فرمول میتوانید به درستی آن پی ببرید) اگر نتیجه این فرمول یک عدد اعشاری باشد این به این معناست که مقدار استفاده شده برای stride نادرست بوده و نورون ها را نمیتوان با این مقدار طوری کنار یکدیگر مرتب کرد که بخوبی در سرتاسر توده ورودی بصورت متقارن جای شوند. برای درک این فرمول مثال زیر را در نظر بگیرید .
تصویری از ترتیب (قرارگیری) مکانی.
در این مثال تنها یک بعد مکانی (محور x) , یک نورون با ناحیه ادراکی با اندازه F = 3 و یک ورودی با اندازه W = 5 وجود دارد(۱,۲,-۱,۱,-۳). Zero padding هم برابر با P = 1 است. (یک صفر به دو طرف ورودی اضافه شده است)
در تصویر سمت چپ stride با اندازه S = 1 اعمال شده است که باعث اندازه خروجی :
شده است. در تصویر سمت راست stride با اندازه S = 2 باعث اندازه خروجی :
شده است. توجه کنید که stride با اندازه S = 3 امکان پذیر نمیباشد چرا که با این مقدار نمیتوان نورون ها را بخوبی در سرتاسر توده جای داد. اگر از لحاظ فرمولی بخواهیم به این مسئله نگاه کنیم میبینیم که مقدار ۴=۲+۳-۵ بر ۳ قابل تقسیم نیست (بخش پذیر نیست). وزن نورونها در این مثال [۱,۰,-۱] (همانطور که در منتها الیه تصویر سمت راست نمایش داده شده است ) و بایاس آن برابر با ۰ میباشد.. این وزنها بین تمام نورون های زرد رنگ مشترک است (بخش اشتراک پارامترها را در زیر بخوانید)
استفاده از Zero-padding :
در مثال قبل (تصویر سمت چپ) توجه کنید که بُعد ورودی برابر ۵ و بعد خروجی نیز مساوی ۵ بود. به این خاطر این اتفاق رخ داد چرا که ناحیه ادراکی برابر با ۳ بود و ما از zero padding مساوی با ۱ استفاده کردیم . اگر zero padding یی وجود نداشت , توده خروجی تنها بعدی برابر با ۳ میداشت. چرا که تنها این تعداد نورون در سرتاسر ورودی اصلی میتوانستند جا بگیرند. بطور کلی تنظیم مقدار Zero padding بر اساس فرمول:
در زمانی که Stride برابر با S = 1 باشد اطمینان حاصل میکند که توده ورودی و توده خروجی هر دو از لحاظ مکانی دارای اندازه یکسانی خواهند بود. استفاده از Zero padding به اینصورت بسیار رایج بوده و ما توضیحات تکمیلی را جلوتر زمانی که در مورد معماری شبکه های کانولوشن بیشتر صحبت میکنیم خواهیم داد.
محدودیت های Stride
توجه کنید که ترتیب مکانی فراپارامترها (Hyper paramters) محدودیت های دوطرفه دارند. بعنوان مثال زمانی که اندازه ورودی برابر با ۱۰ بوده و هیچ zero padding استفاده نشده باشد (P=0) و اندازه فیلتر برابر با F=3 باشد بنابر این استفاده از stride یی با اندازه S = 2 غیر ممکن خواهد بود. چرا که:
که همانطور که مشاهده میکنید نتیجه یک عدد صحیح نبوده و فلذا نورون ها نمیتوانند بصورت متقارن و بخوبی در سرتاسر ورودی جای(قرار) بگیرند. بنابراین این مقادیر این فراپارامترها نامعتبر در نظر گرفته میشود و اگر شما سعی کنید یک شبکه عصبی کانولوشن با این مقادیر در یک کتابخانه مربوط به شبکه عصبی کانولوشن ایجاد کنید به احتمال بسیار زیاد با یک Exception مواجه خواهید شد. همانطور که جلوتر در بخش معماری های شبکه کانولوشن خواهیم دید, تنظیم اندازه ها در شبکه کانولوشن بصورت مناسب بطوری که تمامی ابعاد آن بدرستی کار کنند کار واقعا طاقت فرسایی میتواند باشد که البته با استفاده از Zero-padding و تعداد دیگری از راهکارهای طراحی تا حد بسیار زیادی میتوان از سختی آن کاهید.
[۱] یعنی تنها بخشی از عرض و ارتفاع را شامل میشود. (مثلا اگر عرض و ارتفاع تصویر به ترتیب برابر ۳۲ و ۳۲ باشد. فیلتر ممکن است اندازه برابر با ۴×۴ داشته باشد.
[۲] به متغیرهای مختلف که در نتیجه مسئله ای دخیل هستند در Machine learning بُعد گفته میشود. در اینجا هر پیکسل یک تصویر یک متغییر بحساب می آید (چرا که بصورت یک ورودی مجزا به شبکه ارائه میشود و مقدار آن در کارکرد شبکه موثر است ) . بنابر این یک تصویر با ۲۰x20x3 1200 بعد خواهد داشت. از این رو در اینجا ابعاد بالای تصاویر به معنای بزرگتر بودن اندازه تصاویر است.
نمونه واقعی از شبکه های عصبی کانولوشن
معماری Krizhevsky et al که برنده رقابت ImageNet در سال ۲۰۱۲ شد تصاویری با اندازه ۲۲۷x227x3 را بعنوان ورودی دریافت میکرد. در لایه کانولوشن اول این شبکه از نورون هایی با ناحیه ادراکی با اندازه F=11 , Stride با مقدار S=4 و zero padding P = 0 استفاده میشد. از آنجایی که ۵۵=۱+۴/(۱۱-۲۲۷) و عمق لایه کانولوشن برابر با K = 96 بود توده خروجی لایه کانولوشن اندازه ای برابر با ۵۵x55x96 داشت. هر کدام از ۵۵x55x96 نورون در این توده به ناحیه ای از ورودی با اندازه ۱۱x11x3 متصل بودند. علاوه بر آن تمام ۹۶ نورون در هر ستون عمقی (depth column) هم به یک ناحیه از ورودی با اندازه ۱۱x11x3 متصل بودند البته با وزنهای متفاوت.
اشتراک پارامتر
طرح اشتراک پارامتر در لایه های کانولوشن به منظور کنترل تعداد پارامترها مورد استفاده قرار گرفت. با استفاده از نمونه عینی که در بالا داده شد, ما میبینیم که ۵۵x55x96=290,400 نورون در لایه کانولوشن اول وجود دارد و هر کدام از آنها ۱۱x11x3=363 وزن و ۱ بایاس دارند. همه اینها با هم تشکیل ۲۹۰۴۰۰×۳۶۴=۱۰۵,۷۰۵,۶۰۰ پارامتر را تنها برای لایه اول شبکه کانولوشن میدهند. کاملا پیداست که این عدد بسیار بزرگی است.
ما میتوانیم با یک فرض منطقی تعداد بسیار زیادی ازاین پارامترها را کاهش دهیم. و آن فرض این است که اگر یک Patch feature برای محاسبه در یک موقعیت مکانی (x,y) مفید باشد پس باید برای محاسبه همان feature در موقعیت متفاوت (x2,y2) هم مفید باشد. به عبارت دیگر اگر یک برش دو بعدی از عمق را یک برش عمقی بنامیم (بعنوان مثال یک توده با اندازه ۵۵x55x96 دارای ۹۶ برش عمقی است که هر کدام دارای اندازه ۵۵×۵۵ میباشند) ما هر نورون در این برش عمقی را محدود به استفاده از یک مجموعه وزن و بایاس میکنیم . با این طرح اشتراک پارامتر, لایه کانولوشن اول در مثال ما حالا فقط ۹۶ مجموعه وزن یکتا خواهد داشت (یک مجموعه وزن برای هر برش عمقی ) که در کل برابر ۹۶x11x11x3 = 34,848 وزن یکتا یا ۳۴,۹۴۴ پارامتر (به اضافه ۹۶ بایاس) خواهد بود . متناوبا تمام ۵۵×۵۵ نورون موجود در هر برش عمقی حالا از یک مجموعه پارامتر استفاده میکنند. در عمل در حین Backpropagation هر نورون موجود در توده gradient را برای وزنهایش حساب میکند اما این gradient ها درسرتاسر هر برش عمقی جمع شده و تنها یک مجموعه وزن در هر برش را بروز میکند.
توجه کنید که اگر تمام نورون ها در یک برش عمقی از یک بردار وزن یکسان استفاده کنند بنابر این عملیات forward pass لایه کانولوشن میتواند در هر برش عمقی بصورت ضرب (convolution) بین وزنهای نورون با توده ورودی محاسبه شود (برای همین به آن لایه کانولوشن گفته میشود) بنابر این رایج است که به مجموعه وزن ها بعنوان یک فیلتر نگاه شود( یا یک کرنل). که با ورودی ضرب (convolve) شده است. نتیجه این عمل (Convolution) یک نگاشت فعالسازی (Activation map) است ( مثلا با اندازه ۵۵×۵۵ ) و مجموعه این Activation map ها برای هر فیلتر مختلف در راستای بعد عمق بر روی هم قرار گرفته تا توده خروجی را ایجاد کنند(مثلا با اندازه ۵۵x55x96)
فیلترهای نمونه که توسط Krizhevsky et al یادگرفته شده اند. هر کدام از این ۹۶ فیلتر نمایش داده شده در اینجا اندازه ای برابر با ۱۱x11x3 دارند و هر کدام از انها با ۵۵×۵۵ نورون در یک برش عمقی به اشتراک گذاشته شده اند. دقت کنید که فرض اشتراک پارامترها نسبتا منطقی هم هست. اگر کشف یک لبه افقی در جایی از تصویر مهم باشد, قائدتا برای سایر مکانها در تصویر هم باید بواسطه ساختار translationally-invariant تصاویر مفید باشد. بنابر این دیگر نیازی به یادگیری دوباره کشف لبه افقی برای تک تک ۵۵×۵۵ مکان مشخص در توده خروجی لایه کانولوشن نیست. یعنی لازم نیست تا این عمل یادگیری کشف لبه افقی برای تک تک مکان ها تکرار شود.
توجه کنید که بعضی اوقات فرض اشتراک پارامتر ممکن است منطقی بنظر نیاید. خصوصا زمانی که تصاویر ورودی به یک شبکه کانولوشن دارای ساختارهای وسط چین (specific centered structure) خاص باشند, که ما باید انتظار داشته باشیم , بعنوان مثال ویژگی های مختلفی از یک طرف تصویر نسبت به طرف دیگر یاد گرفته شود. یک نمونه عملی از این مورد زمانی است که تصاویر صورت وسط چین شده اند. ممکن است ما انتظار داشته باشیم که ویژگی های مختلف مخصوص مو (hair specific) و یا مخصوص چشم (eye-specific) بتوانند ( و باید) در موقعیتهای مکانی مختلف یاد گرفته شوند. در این حالت معمولا رایج است که طرح اشتراک پارامتر را کنار گذاشته و بجای آن خیلی ساده به آن لایه بصورت محلی متصل (Locally connected layer)گفته شود.
برای اینکه مطالبی که تا بحال بیان شد را بهتر درک کنیم در اینجا سعی میکنیم مفاهیم بیان شده را در قالب کد بیان کنیم . برای اینکار از زبان پایتون استفاده میکنیم که امروزه یکی از زبانهای بسیار پرکاربرد خصوصا در زمینه Deep learning و شبکه های کانولوشن است.
ما برای راحتی هرچه بیشتر از کتابخانه Numpy استفاده میکنیم که یکی از کتابخانه های مشهور پایتون در زمینه کار با عملیاتهای برداری است.سینتکس این کتابخانه هم شبیه به متلب بوده و کسانی که با متلب آشنایی دارند براحتی دستورات معادل را درک میکنند.
فرض کنید توده ورودی ما یک آرایه با نام X باشد. در اینصورت :
- برای بدست آوردن یک depth column در موقعیت (x,y) از دستور X [ x , y , : ] استفاده میکنیم
- برای بدست آوردن یک برش عمقی (depth slice) یا بطور مساوی همان نگاشت فعال سازی(activation map) در عمق d از دستور X[ : , : , d ] استفاده میکنیم.
فرض کنید توده ورودی X دارای ابعاد X.shape: (11,11,4) باشد این دستور یعنی توده ای با اندازه ۱۱x11x4 ایجاد شود که به معنای عرض و ارتفاع ۱۱ و عمق ۴ میباشد. حال فرض کنید ما از Zero padding استفاده نکنیم ( یعنی P=0 ) و اندازه فیلتر (یا همان ناحیه ادراکی ) برابر با F = 5 و stride هم برابر S = 2 باشد. با توجه به این اطلاعات ما میتوانیم اندازه مکانی (یعنی عرض و ارتفاع) توده خروجی را بدست بیاوریم . اندازه توده خروجی برابر ۴=۱+۲/(۵-۱۱) خواهد بود که به معنای توده ای با عرض و ارتفاع ۴ است . نگاشت فعال سازی (Activation map) نیز در توده خروجی (که از این به بعد به آن V میگوییم ) بصورت زیر خواهد بود ( دقت کنید ما تنها بعضی از محاسبات را در مثال زیر قید میکنیم)
- V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
- V[1,0,0] = np.sum(X[2:7,:5,:] * W0) + b0
- V[2,0,0] = np.sum(X[4:9,:5,:] * W0) + b0
- V[3,0,0] = np.sum(X[6:11,:5,:] * W0) + b0
ذکر این نکته ضروری است که در numpy عملیات ضرب (*) که در بالا شاهد آن هستید عمل ضرب خانه به خانه (elementwise) را در آرایه انجام میدهد. نکته دیگر آنکه بردار وزن W0 بردار وزن مربوط به نورون ۰ بوده و b0 هم بایاس مربوط به آن میباشد. در اینجا فرض کردیم W0 ابعادی بصورت ۵x5x4 دارد . (W0.shape: (5,5,4) ) , چرا که اندازه فیلتر (یا همان ناحیه ادراکی) برابر با ۵ بوده و عمق توده ورودی نیز برابر با ۴ است. توجه کنید که در اینجا ما همانند شبکه های عصبی معمولی ضرب نقطه ای را انجام میدهیم. همچنین در اینجا مشاهده میکنید که ما در حال استفاده از یک وزن و بایاس هستیم (بواسطه اشتراک پارامتر) و ابعاد در راستای عرض در گام های ۲ تایی (مقدار Stride) افزایش پیدا میکنند. به منظور ساختن نگاشت فعال سازی(Activation map) دوم در توده خروجی بصورت زیر عمل میکنیم :
- V[0,0,1] = np.sum(X[:5,:5,:] * W1) + b1
- V[1,0,1] = np.sum(X[2:7,:5,:] * W1) + b1
- V[2,0,1] = np.sum(X[4:9,:5,:] * W1) + b1
- V[3,0,1] = np.sum(X[6:11,:5,:] * W1) + b1
نمونه ای از حرکت در راستای y:
- V[0,1,1] = np.sum(X[:5,2:7,:] * W1) + b1
نمونه ای از حرکت در هر دو راستای x وy:
- V[2,3,1] = np.sum(X[4:9,6:11,:] * W1) + b1
جایی که مشاهده میکنید ما در حال اندیس گذاری در بُعد عمقی دوم در V (اندیس ۱ ) هستیم به این خاطر است که ما در حال محاسبه نگاشت فعال سازی دوم (Activation map) هستیم و به همین دلیل مجموعه متفاوتی از پارامترها (W1) باید استفاده شود. در مثال بالا ما بخاطر خلاصه سازی از نوشتن تمامی عملیات هایی که در لایه کانولوشن برای پر کردن باقی بخش های آرایه خروجی V صورت میگیرد پرهیز کردیم. علاوه بر آن بیاد داشته باشید که این نگاشتهای فعال سازی (Activation maps) اغلب بصورت خانه به خانه توسط یک تابع فعال سازی مثل ReLU مورد پردازش قرار میگیرند (تا خروجی نهایی تشکیل شود) اما این مسئله در اینجا نشان داده نشده است.
خلاصه
در اینجا ما بصورت خلاصه مطالبی که در بالا به آن پرداختیم را مرور میکنیم
یک شبکه کانولوشن :
یک توده با اندازه W1 x H1 x D1 را بعنوان ورودی دریافت میکند که W نشانگر عرض , H نشانگر ارتفاع و D نشانگر عمق آن میباشد.
نیازمند ۴ فراپارامتر(Hyper parameter) است :
- تعداد فیلتر ها K
- اندازه وسعت مکانی(اندازه x , y) فیلترها )اندازه ناحیه ادراکی) F
- اندازه گام یا Stride S
- مقدار Zero padding P
تولید یک توده خروجی با اندازه W2 x H2 x D2 که :
- W2=(W1-F+2P)/S+1
- H2=(H1-F+2P)/S+1 (یعنی عرض و ارتفاع هر دو بطور مساوی بصورت متقارن محاسبه میشوند)
- D2=K
با اشتراک پارامتر, دارای F.F.D1 وزن به ازای هر فیلتر بوده که در کل F.F.D1).K) وزن و K بایاس میباشد.
برش dام ( با اندازه W2 X H2 ) ,در توده خروجی نتیجه انجام یک ضرب (convolution) معتبر بین فیلتر dام با توده ورودی با stride S بوده که سپس با بایاس d ام جمع شده است.
یک نمونه از مقادیر رایج برای فراپارامترهای توضیح داده شده در بالا بصورت F=3,S=1,P=1 است. البته شیوه ها و قوانین متداولی وجود دارند که باعث رسیدن به این مقادیر میشوند. (بخش معماری شبکه کانولوشن را برای اطلاعات بیشتر ببینید)
در این قسمت ما نحوه فعالیت صورت گرفته در یک لایه کانولوشن را گام بگام توسط تصویر نشان میدهیم . بخاطر اینکه نمایش حجم های سه بعدی کمی مشکل است تمام توده های سه بعدی (توده ورودی (با رنگ آبی ) , توده وزن ها ( با رنگ قرمز) و توده خروجی (با رنگ سبز) ) بصورت برش هایی نمایش داده شده اند. اندازه توده ورودی برابر با W1 = 5, H1 = 5,D1= 3 میباشد( به ترتیب معرف عرض, ارتفاع و عمق) , پارامترهای لایه کانولوشن نیز به ترتیب برابر با K=2 , F = 3 , S = 2 و P =1 میباشند که به معنای آن است که ما دو فیلتر با اندازه ۳×۳ داریم که با گام (stride) S =2 بر روی توده ورودی اعمال میشوند. بنابر این اندازه توده خروجی ما هم برابر با ۳=۱+ ۲/(۲+۳-۵) خواهد بود. علاوه بر این , توجه کنید که عمل Padding با مقدار P=1 بر روی توده ورودی اعمال شده که این عمل باعث ۰ شدن مرز های بیرونی توده ورودی شده است. در تصاویر زیر میبینید که تعداد تکرار عملیات به اندازه تعداد عناصر موجود در توده خروجی( به رنگ سبز) است در تصویر مشاهده میکنید که هر عنصر در توده خروجی از ضرب عنصر به عنصر توده وزن (ماتریس وزن برنگ قرمز ) با توده ورودی (برنگ آبی) و سپس جمع تمامی عناصر با هم و نهایتا افزودن بایاس به نتیجه نهایی بدست می آید.(Convolution) بعنوان مثال برای عنصر اول توده خروجی داریم :
( (۰*-۱)+(۰*-۱)+(۰*۰)+(۰*-۱)+(۲*۰)+(۱*-۱)+(۰*-۱)+(۱*۰)+
(۰*۰))+( (۰*۱)+(۰*۱)+(۰*-۱)+(۰*-۱)+(۰*۰)+(۰*۰)+(۰*۰)+(۲*۱)+
(۰*۰))+( (۰*۰)+(۰*-۱)+(۰*۱)+(۰*۱)+(۲*۱)+(۱*۰)+(۰*۱)+(۰*۰)+
(۰*-۱) )+۱=۴
پایان بخش دوم آموزش
سید حسین حسن پور
بهار ۹۵























بخش سوم رو هم انشاالله سر فرصت میزارم .
تو بخش سوم در مورد معماری ها و… بیشتر توضیح میدم
سلام . من یه سوال داشتم. منظور از این قسمتو نمیفهمم”توجه کنید که بعضی اوقات فرض اشتراک پارامتر ممکن است منطقی بنظر نیاید.” میشه یکم بیشتر توضیح بدید.یعنی چی موقعیت مکانی تصویر در کانولوشن در نظر گرفته نمی شه؟؟؟؟؟؟
سلام.
اون بخش داره میگه که فرض اشتراک پارامتر در زمانی که نیاز به جزییات بیشتری از ورودی در مکانهای مختلف هست استفاده نمیشه (نشه بهتره و بجاش) باید از locally connected layer بدون اشتراک وزن استفاده کرد.
این نکته مهمه که دقت کنید لایه کانولوشن هم یک لایه locally connected هست (برخلاف fully connected layer ) که و نورونها تنها به یک ناحیه از ورودی متصل هستن با اندازه receptive field (همون F که اندازه فیلتر ما رو مشخص میکرد).
حالا فرقشون چیه؟
تو لایه کانولوشن ما اشتراک پارامتر داریم . یعنی یه فیلتر یکسان روی تمامی پیکسلهای ورودی اعمال میشه.این فیلتر هم یه ماتریس وزن بیشتر نداره . پس همه پیکسلهای ورودی از وزنهای فیلتر بصورت اشتراکی استفاده میکنن. و ما طی آموزش به شبکه اجازه میدیم که این وزنها رو کم و زیاد کنه تا نهایتا به نتیجه مورد نظرمون برسیم. (عملیاتی هم که انجام میشه ضرب نقطه ای بین پیکسل و این فیلتر جمع نتیجه حاصل هست(که میگیم کانولوشن انجام دادیم).این عمل کانولوشن ما باعث ارائه یه translation invariance هم میشه. در قضیه لایه بصورت محلی متصل بدون اشتراک وزن کاری که کردن اینه که برخلاف قبل هر پیکسل درورودی یه فیلتر(ماتریس وزن) اختصاصی داره . یعنی مثلا اگر ما تصویر ورودی با اندازه ۱۲۸ در ۱۲۸ داشته باشیم . و تعداد ۲۵۶ فیلتر با اندازه ۵*۵ داشته باشیم میشه ۱۲۴ فیلتر رو روی تصویر ورودی جا داد و اعمال کرد (با گام ۱ اگه در نظر بگیریم) پس ما اینجا ۱۲۴*۱۲۴*۲۵۶*۵*۵ پارامتر داریم که باید محاسبه بشن و این درحالیه که در لایه کانولوشن ما فقط ۲۵۶*۵*۵ پارامتر داشتیم که باید train میشدند. نکته دیگه هم اینه که تو لایه Locally connected بدون اشتراک وزن ما عمل کانولوشن نداریم (یعنی ضرب نقطه ای و بعد جمع همه اعداد باهم) و فقط شرب نقطهای بین پیکسلهای ورودی با ماتریس وزن هرکدوم هست.
این قضیه تو DeepFace فکر میکنم اولین بار مطرح شد و نتایج خیلی خوبی هم تو دسته بندی تصاویر بدست آورد. متاسفانه تو Caffe هنوز پیاده سازی نشده و منم تست نکردم . اما تو Cuda-convnet و فکر میکنم Torch پیاده سازی شده.
بخش دوم صحبتتون رو هم متوجه نشدم . لطفا کامل بنویسید یا متن کامل رو قرار بدید تا توضیح بدم خدمتتون .
۱٫خب وقتی به جای لایه کانولوشن، لایه locally connected استفاده میشه دیگه این شبکه عصبی کانولوشنی نیست درسته؟۲٫ پس میتونیم بگیم شبکه کانولوشن برای وقتی که من میخوام رنگ چشم یک عکس رو بدونم کارایی خوبی نداره ولی برای تشخیص چهره که انسانه یا حیوان کاراییش خوبه؟ ۳٫اینکه چرا در جزئیات کارای خوبی نداره به دلیل اشتراک پارامتره .و اینکه خاصیت اشتراک پارامتر چیه؟(اشتراک پارامتر چجوریه که باعث میشه جزئیات از دست برن؟)
۴٫چرابه این نتیجه رسیدن که از اشتراک پارامتر استفاده کنن؟ و هدف هم کاهش تعداد پارامتر هاست فقط!
۵٫در قسمت قبل هم گفتین لایه ادغام پارامتر نداره یعنی چی؟ خب نرون های لایه کانولوشن که با روش های ادغام وصل میشن به یک نرون در لایه ادغام به هر کدوم یه وزنی میدیم دیگه. مثلا تو maxpooling به نرونی که مقدار تابع فعال سازیش بیشتره وزن یک و میدیم به بقیه صفر وصل میشن به یه نرون تو لایه ادغام درسته؟
۶٫ convolutional networks are well adapted to the translation invariance of images: move a picture of a cat (say) a little ways, and it’s still an image of a cat* *In fact, for the MNIST digit classification problem we’ve been studying, the images are centered and size-normalized. So MNIST has less translation invariance than images found “in the wild”, so to speak. Still, features like edges and corners are likely to be useful across much of the input space.
و اینو نمیفهمم! یعنی شبکه کانولوشن به تغییر جای شکل ها تو تصویر حساسیت نداره ولی شبکه عصبی معمولی حساسیت داره؟
سلام
اگر اصلا استفاده نشه درسته ولی در عمل این لایه به همراه لایه کانولوشن و بقیه لایه ها استفاده میشه . مثل لایه fully connected . (البته تو دیپ لرنینگ همیشه از شبکه کانولوشن استفاده نمیشه .میتونید از انواع دیگه هم استفاده کنید.)
بزارید اینطور جواب بدم در حالت کلی حرف شما درسته. وقتی نوبت به تصاویر صورت میرسه برای اینکه ویژگی های مختلف تو تصویر (مثل چشم و بینی و…) در جاهای مختلف یادگرفته بشن از اشتراک پارامتر استفاده نمیشه. از همون Locally connected layer بدون اشتراک وزن استفاده میشه.
و از اشتراک پارامتر معمولا در تصاویر طبیعی یا کلا Object recognition بطور کل استفاده میشه و منطقش هم به این شکل هست که خب من با یه تصویر مواجه هستم پس قائدتا منطقیه که یک ویژگی از بخشهای مختلف تصویر استخراج بشه . برای همین اشتراک وزن وجود داره و از این طریق فیلتر یکسانی که برای استخراج یک ویژگی استفاده میشه روی تمام تصاویر اعمال میشه و اینطور ویژگی مرتبط با اون فیلتر در بخشهای مختلف تصویر استخراج میشه.
از طرفی تا بحال برای اینکه دقت و کارایی تشخیص افزایش پیدا بکنه از افزایش عمق استفاده کردن . یعنی هرچقدر شما عمق شبکه خودتون رو بیشتر کنید جزییات و ویژگی های سطح بالاتری رو بدست میارید و میتونید استفاده کنید.
چیزی که من میتونم بگم اینه که احتمالا شما میتونید به همون دقتی که از طریق locally connected layer بدست میارید از طریق شبکه کانولوشن با عمق بیشتر بدست بیارید. ولی خب هزینه و مسائلی مثل overfitting و… مسائل مربوط به شبکه های عمیق رو هم باید تحمل کنید.
از طرفی تو لایه تماما متصل شبکه مجبور هست که ویژگی های مختلف رو تو جاهای مختلف تصویر بطور مجزا یادبگیره. مثلا صد جا دقیقا یه edge detector یکسان رو یاد بگیره در حالی که این قضیه در شبکه کانولوشن اینطور نیست و ما میگیم اگر یه جا edge detector مفید بود احتمالا جاهای دیگه هم هست و اینجاس که فیلترها با مفهوم اشتراک وزن معنا پیدا میکنن. یه نکته دیگه اینه که لایه های تماما متصل ویژگی های خاص تصاویر رو در نظر نمیگیرن و مثلا پیکسلهای کنار هم در ورودی رو با پیکسلهایی که از هم کاملا فاصله دارن یکجور برخورد میکنن باهاشون و این مساله باعث میشه استفاده از شبکه های تماما متصل تو بحثهای مربوط به تشخیص تصاویر بخوبی عمل نکنه و تعداد زیاد پارامترها هم خیلی سریع باعث over-fitting بشه.
دلیل دیگه استفاده از اشتراک وزن همون بحث کاهش تعداد پارامترها هست که خودتون اشاره کردید. این مساله هم سرعت پردازش رو خیلی خوب کرد و هم تو جلوگیری از over-fitting خیلی مفید هست.
۵٫ منظور از پارامتر نداشتن اینه که واقعا پارامتر (قابل یادگیری) نداره که در اموزش دخیل باشه یا بخواد بروز بشه . صرفا یه عملیات هست که روی خروجی توده ها اعمال میشه. اینو در مقابل پارامترهای قابل یادگیری بقیه شبکه قرار بدید متوجه میشید .
بعد اینکه نرونهای لایه کانولوشن وصل نمیشن به نورونهای موجود در لایه ادغام !. اصلا ضربی انجام نمیشه . فقط ماکسیمم اون ناحیه حساب میشه و در خروجی قرار میگیره.
۶٫بله . شبکه کانولوشن همونطور که بالا توضیح دادم translation invariance ارائه میکنه که اونم بخاطر در نظر گرفتن ماهیت محلی نواحی در تصاویر (و عملیات کانولوشن) هست. این قضیه در مورد شبکه عصبی معمولی که هیچکدوم از خاصیتهای تصاویر رو در نظر نمیگیره و یه ضرب نقطه ای صرف انجام میده صادق نیست.
یه نکته دیگه یادم رفت. ضمنا من نگفتم شبکه کانولوشن در جزییات کارایی خوبی نداره!! برای اینکه جزییات بیشتری از تصویر ورودی کشف بشه عمق شبکه کانولوشن رو زیاد میکنن. هرچقدر عمق بیشتر باشه ویژگی های سطح بالای بیشتری شناسایی میشه (مثل چشم بینی و ویژگی ها و جزییات بیشتر) پس شما کما کان میتونید بنظر من بدون استفاده از Locally connected layer بدون اشتراک وزن به نتیجه خوبی برسید اما! نکته اینجاست که ممکنه با استفاده از لایه بصورت محلی متصل بدون اشتراک وزن طی عمق خیلی کمتری به اون نتیجه برسید چون ویژگی های بیشتری رو بدست میده.
و نکته دیگه که یادم رفت بگم هم اینه که translation invariance در لایه بصورت محلی متصل بدون اشتراک وزن وجود نداره! و دلیل استفاده اش هم (احتمالا)بخاطر همین قضیه اس تا اینطور ویژگی های خاص در بخشهای مختلف یادگرفته بشه.
اولا خیلی ممنونم که به سوالام با حوصله و دقت پاسخ میدید.
۱من همین مفهوم translation invariance رو نمیدونم یعنی چی؟
۲و اینکه ما وقتی یک فیلتر اعمال میکنیم و یه feature map تو لایه کانولوشن ساخته میشه میگیم این فیچر مپ داره یک ویژگی را در مکان های مختلف تصویر ورودی نشون میده یعنی مثلا یک فیلتر میاد یه ویژگی مثل edge detector را در مکانهای مختلف تصویر بهمون میده بعد فیلتر دیگ یه ویژگی دیگه از تصویر رو میده پس اینم داره یه ویژگی رو تو مکانهای مختلف تصویر به دست میاره پس اینکی که شما میگین (از طرفی تو لایه تماما متصل شبکه مجبور هست که ویژگی های مختلف رو تو جاهای مختلف تصویر بطور مجزا یادبگیره. مثلا صد جا دقیقا یه edge detector یکسان رو یاد بگیره ) چه فرقی داره؟
۳٫و اینک توی آموزش شبکه مثلا با back propagation مگه ما نمیاییم خروجی هر نرون رو تو لایه کانولوشن با ضرب نرون هایی که تولایه قبلن در وزنشون و اعمال تابع فعال سازی به دست می آوریم. حالا باید بیاییم خروجی هر نرون را در لایه ادغام هم به دست بیاریم اینجا خروجی را چطور به دست می یاریم تا آخرش مقدار نرون های لایه خروجی مونو به دست بیاریم منهای مقدار هدف کنیم و بیاییم وزنها رو آپدیت کنیم.
میشه لطف کنید مرحله آموزش رو توضیح بدید.
مرسی از لطفتون
سلام خواهش میکنم .

۱٫ من بک گراند کامپیوتر ویژن ندارم اما چیزی که خودم فهمیدم از مقالات منظور این هست که یک تصویر اگر جابجا بشه (شیفت پیدا کنه) مشکلی تو تشخیصش نباشه .
ببینید وقتی شما یه تصویر دارید مثل این :
حالا اگه اون رو به چپ چند پیکسل شیفت بدید از لحاظ مقادیر پیکسل ها تصویر کاملا عوض شده درسته ؟
و این
اما ما میتونیم ببینیم که تصویر همون تصویره. تشخیص ماهیت یک تصویر با توجه به تمام اینگونه تغییراتی که روی اون اعمال شده رو میگن translation invariance برای توضیحات بیشتر اینوببینید خیلی خوبه .
(من سوال کردم تعریف دقیقتری که یکی از دانشجوهای هوش مصنوعی بمن دادن اینه :
(انتقال(translation) تصویر در واقع همه ی پیکسل های تصویر به اندازه ی ثابتی در جهت خاصی انتقال پیدا میکنن .)
کلا invariance که میاد یعنی بی تفاوتی نسبت به اون بخش اول (در اینجا translation یا انتقال در یک جهت خاص). rotation invariance هم یعنی بی تفاوت نسبت به چرخش. view invariance هم یعنی بی تفاوت نسبت به دیدهای مختلف! و الخ)
۲٫فرقش در اینه که ما یکبار یه edge decector یادمیگیریم و بعد برای بقیه جاها ازش استفاده میکنیم اما تو شبکه عصبی تماما متصل دقیقا مثلا یک edge detector چندیدن بار یادگرفته میشه اونم در جاهای مختلف تصویر که نیازی اصلا به این کار نیست. وقتی یکبار انجام شده و دقیقا همون هست چرا باید هزینه پردازشی متقبل بشیم برای یادگرفتن دوباره و چندین باره عینا همون ویژگی ؟
۳٫رو متوجه نشدم چی نوشتین . مشکلتون کجاست؟ مرحله آموزش رو نمیدونید چطور انجام میشه ؟ یا بک پراپگیشن رو نمیدونید چطور انجام میشه ؟
اینو فهمیدم از طرفی تو لایه تماما متصل شبکه مجبور هست که ویژگی های مختلف رو تو جاهای مختلف تصویر بطور مجزا یادبگیره. مثلا صد جا دقیقا یه edge detector یکسان رو یاد بگیره یعنی اینکه تو این شبکه یه ویژگی تکراری در یه مکان از تصویر چند بار یاد گرفته میشه . ولی سوال ۱ و۲ رو میشه بگید
اینو جواب دادم . اگر متوجه نشدید دوباره بفرمایید تا یه طور دیگه توضیح بدم.
من آموزش شبکه کانولوشنو با بک پراپگیشن میگم. مثلا ببینید میخاییم اینکارو بکنیم. هر واحد درلایه کانولوشن سیگنال های ورودی وزن دار خود را جمع می بندد و از تابع فعال سازی هیپربولیک برای محاسبه سیگنال خروجی استفاده می کند و این سیگنال به لایه ادغام فرستاده می شود.خب بعد شما میگید لایه کانولوشن به لایه ادغام وصل نیست بعد چجوری خروجی لایه ادغام محاسبه میشه میره به لایه خروجی؟؟؟؟؟ که لایه خروجی هم سیگنال های ورودی وزن دار خود را جمع می بندد و از تابع فعال سازی هیپربولیک برای محاسبه سیگنال خروجی استفاده می کند. و نتیجه فعال سازی محاسبه شده برای هر واحد خروجی با مقدار هدف مقایسه می شود و خطای مربوط به آن الگو برای هر واحد به دست می آید تا برای آپدیت وزنها استفاده شه. یعنی هیچ وزنی بین لایه ادغام و کانولوشن نیست؟
نه من منظورم این نبود که وصل نیست! منظورم در جواب شما بود که وزن و ضرب در نظر گرفته بودید بین این دو!
لایه ادغام در اصل داره عمل subsampling رو انجام میده . یعنی خروجیش همون خروجی لایه قبلشه که یک عملیات max ,min یا AVE یا هر عملیات دیگه ای دوباره انجام میشه تا توده جدید اندازه مکانیش کاهش پیدا کنه و توده جدید بدست بیاد
بعد این توده به لایه بعدی متصل میشه همین!
شما اینو دقیقا مثل Relu یا tanh در نظر بگیرید که روی تک تک نورونها اعمال میشدن.(تابع فعال سازی) (این حالا با یه فیلتر اعمال میشه رو توده قبل خودش). فک کنید بعد tanh یه تابع دیگه دارید بنام maxpooling مثلا. همین!
نه هیچ وزنی بین لایه ادغام (pooling ) و کانولوشن نیست.
ضمنا یه نکته مهم دیگه الان دیگه از اون Tanh استفاده نمیکنن!
پس چرا تو این مقاله(Implementation of Training Convolutional Neural Networks)
اومده تو آموزش وزنهای لایه ادغامم آپدیت کرده؟
متن اصلی یا خود مقاله رو لینک میکنید ؟
خیلی ممنونم از راهنمایی های شما واقعا سودمند و مفید بود تشکر
سلام
خواهش میکنم .
یک نکته فقط اگر مقالاتتون رو مثلا از سایت http://arxiv.org میگیرید دقت کنید تو منابع معتبر هم مقاله درج شده باشه . اگر نبود اون مقاله قابل استناد نیست.
تو این سایت هرکسی میتونه مقاله بزاره و صرفا وجود مقاله دلیلی بر صحت و یا درستی و معتبر بودن اون نیست .
از زحمتی که کشیدید و این مطالب ارزنده رو در اختیار همه قرار دادید بینهایت ممنون
بی صبرانه منتظر بخش سوم شبکه های کانولوشن هستیم
سلام.
خواهش میکنم .
خدا رو شکر که مفید واقع شد. انشاالله مباحث بعدی مثل بک پراپگیشن و توضیح بیشتر در مورد پیکربندی و طراحی یه مدل در شبکه کانولوشن و همینطور مسائلی مثل چطور بفهمم شبکه واقعا داره جواب درست بما میده یا نه رو تو بخش بعدی عرض میکنم .
متاسفانه الان بخاطر درگیری مراحل اخر پایان نامه ام وقت برای نوشتن ندارم انشاالله تموم شد این بخشها هم قرار میگیره.
اگر هم دیر جواب میدم ببخشید چون برای مدتی به اینترنت دسترسی ندارم .
سلام و روز بخیر
چند تا سوال داشتم از خدمتتون
اول اینکه ما پس از اعمال فیلترهای مختلف لایه کانولوشن (ر واقع اعمال کانولوشن روی تصویر ورودی با فیلتر های مختلف) به یه سری ماتریس میرسیم که الان این سری ماتریس اسمشون چیه؟ ویژگی های یادگرفته شده هستند؟ اسم اون فیلتر ها که با بک پروپگیشن وزن هاشون آموزش میبینن چی هست اسمشون؟ فیلترهای نهاییمون هستن؟
سوال دوم اینکه مقدار دهی اولیه وزن های فیلترهای لایه کانولوشن چجوریه؟ تصادفیه؟
سوال سوم اینکه نمیتونم درک کنم منظورتون از اینکه تو لایه اول ویژگی های سطح پایین یاد گرفته میشن بعد ویژگی های سطح بلا تو لایه های بالاتر چیه؟ منظورتون تو لایه های بالاتر لایه کانولوشن هست یا بجز اون لایه کانولوشن که خودش کلی لایه(فیلتر) داره میایم دوباره چند تا لایه کانولوشن(که هر کدوم چندتا فیلتر دارن ) میذاریم؟ اگه اینجوریه پس اونوقت باید بگیم ورودی های لایه کانولوشن دوم خروجی های لایه کانولوشن اول(خروجی فیلترهای لایه کانولوشن اول) هست؟
سوال چهارم اینکه منظورتون از pooling چیه؟ چجوری میاد ابعاد خروجی لایه کانولوشن رو کوچیک میکنه؟ میشه یه مثال بزنید؟
سوال پنجم اینکه میشه لطف کنید feed forward شبکه رو بنویسید؟ مثلا بگید خروجی لایه کانولوشن میره به یه تابع فعال سازی بعد تابع pooling بعد …(تا ما با ساز و کار شبکه بدون گیج شدن برخورد کنیم)
سوال ششم اینکه بعد تابع pooling یه سری فیچر(ویژگی) بدست میاد درسته؟ خب این ویژگی ها رو میدیم به یه شبکه عصبی معمولی دیگه تا