پست وبلاگ

آموزش شبکه کانولوشن بخش سوم

آموزش شبکه کانولوشن بخش سوم

بسم الله الرحمن الرحیم

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

پیاده سازی بصورت ضرب ماتریسی :

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

ابتدا هر کدام از نواحی محلی در تصویر ورودی را به ستون تبدیل میکنیم (این عملیات به im2col معروف است).بعنوان مثال اگر ورودی ما حجمی بصورت ۲۲۷x227x3 داشته باشد و بخواهیم آنرا با فیلترهایی با اندازه ۱۱x11x3 به همراه stride s =4 ضرب پیچشی (convolve) کنیم(نکته در انتهای متن و کامنت رو ببینید), بلوکهایی با اندازه ۱۱x11x3 پیکسل را به یک بردار ستونی با اندازه ۱۱x11x3=363 تبدیل میکنیم . با تکرار این عمل بر روی ورودی با گام ((stride          S=4  ناحیه در طول عرض و ارتفاع بدست میدهد که نهایتا باعث ایجاد ماتریس خروجی X_col با اندازه [۳۶۳×۳۰۲۵] خواهد شد که هر ستون این ماتریس یک ناحیه ادراکی (receptive field) بوده و تعداد ۵۵×۵۵=۳۰۲۵ نمونه از آنها در کل وجود خواهد داشت. دقت کنید از انجایی که نواحی ادراکی با هم اشتراک دارند (overlap) هر عدد در توده خروجی ممکن است چندین بار در ستونهای مختلف تکرار شود.

وزنهای شبکه کانولوشن هم به همین شکل به بردار های سطری تبدیل میشوند. بعنوان مثال اگر ۹۶ فیلتر(منظور مجموعه وزنها میباشد) با اندازه ۱۱x11x3 وجود داشته باشد (تعداد وزنها برابر با تعداد عناصر موجود در ناحیه ادراکی است یعنی اگر اندازه ناحیه ادراکی برابر با ۱۱x11x3 است بنابر این به همین تعداد وزن نیز وجود دارد) این عمل باعث ایجاد ماتریس W_row با اندازه [۹۶×۳۶۳] خواهد شد.

حالا نتیجه عملیات کانولوشن (ضرب نقطه به نقطه) برابر با اجرای یک ضرب ماتریسی بزرگ خواهد بود. (np.dot(W_row, X_col)) . این عملیات نتیجه ضرب نقطه ای بین تمام فیلترها و تمام نقاط نواحی ادراکی را بما خواهد داد. در مثال ما خروجی این عملیات یک ماتریس با اندازه [۹۶ x 3025] خواهد بود که نتیجه ضرب نقطه ای بین هر فیلتر در هر موقعیت را میدهد.

نهایتا نتیجه بالا بایستی دوباره به فرم صحیح آن بصورت [۵۵x55x96] تغییر شکل داده شود.

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

عملیات BackPropagation

عملیات Backpropagation برای یک عملیات کانولوشن (هم برای داده و هم وزن ها ) هم یک عملیات کانولوشن (اما با فیلترهای از لحاظ مکانی برعکس شده (spatially filipped filters) ) میباشد.

لایه Pooling

قرار دادن یک لایه Pooling بین چندین لایه کانولوشنی پشت سر هم در یک معماری کانولوشن امری رایج است . کارکرد این لایه کاهش اندازه مکانی (عرض و ارتفاع) تصویر (ورودی) بجهت کاهش تعداد پارامترها و محاسبات در داخل شبکه و بنابر این کنترل overfitting است .لایه Pooling بصورت مستقل بر روی هر برش عمقی از توده ورودی عمل کرده و آنرا با استفاده از عملیات MAX از لحاظ مکانی تغییر اندازه (resize) میدهد. رایجترین شکل استفاده از این لایه به صورت استفاده این لایه با فیلترهایی با اندازه ۲×۲ به همراه stride  S=2(گام) است که هر برش عمقی در ورودی را با حذف ۲ عنصر از عرض و ۲ عنصر از ارتفاع کاهش داده و باعث حذف ۷۵% مقادیر موجود در آن برش عمقی میشود. هر عملیات MAX در اینجا ماکسیمم بین ۴ عدد (یک ناحیه ۲×۲ در برش عمقی) را بدست میدهد. در اینجا بُعد عمق بدون تغییر باقی میماند.

بطور کلی لایه Pooling :

یک توده با اندازه W1 x H1 x D1 را بعنوان  ورودی دریافت میکند که W نشانگر عرض , H نشانگر ارتفاع و D نشانگر عمق آن میباشد.

نیازمند ۲ فراپارامتر است  :

  • اندازه وسعت مکانی(اندازه x , y) فیلترها )اندازه ناحیه ادراکی) F
  • اندازه گام یا Stride S

یک توده خروجی با اندازه W2 x H2 x D2  تولید میکند که :

  • (یعنی عرض و ارتفاع هر دو بطور مساوی بصورت متقارن محاسبه میشوند)

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

دقت کنید که استفاده از zero padding در لایه pooling عمومیت ندارد و این کار صورت نمیگیرد.

این نکته حائز اهمیت است که تا بحال در عمل لایه max pooling به دو صورت ,بیشتر رایج بوده و مورد استفاده قرار گرفته است . صورت اول آن با F=3 و S=2 (که به overlapping pooling معروف است) طراحی شده و صورت دوم که رایج تر است با F=2 و S=2  طراحی میشود. عملیات Pooling با نواحی ادراکی  بزرگتر بیش از حد مخرب بوده و به همین دلیل در عمل معمولا یکی از دو حالت فوق مورد استفاده قرار میگیرند.

General Pooling

علاوه بر max pooling واحدهای pooling قادر به اجرای توابع دیگری نظیری average pooling و یا حتی L2-norm pooling نیز هستند.Average pooling در ابتدا اغلب مورد استفاده قرار میگرفت تا اینکه اخیرا در قیاس با max pooling که در عمل ,عملکرد بهتری از خود ارائه داده است گرایش به آن از بین رفته است.


عملیات pooling

image056

نمایش لایه max-pooling و چگونگی کاهش ابعاد

لایه Pooling توده ورودی را در هر برش عمقی بصورت مستقل(یعنی هر برش بدون توجه به برش دیگر) از لحاظ مکانی کاهش میدهد (اصطلاحا downsample میکند). تصویر سمت چپ: در این مثال توده ورودی با اندازه ای برابر با [۲۲۴x224x64]  را با اندازه فیلتر F=2 و Stride  S=2 به توده خروجی با اندازه [۱۱۲x112x64] کاهش داده شده است. توجه کنید که عمق توده بدون تغییر حفظ شده است . تصویر سمت راست : رایجترین عملیات downsampling عملیات max است که به همین علت به این لایه ,لایه max pooling  گفته میشود اینجا از stride با اندازه ۲ استفاده شده است. به عبارت ساده تر این به این معناست که ماکسیمم ۴ عدد گرفته شده است (یک مربع ۲×۲ کوچک.)

Backpropagation

(توضیحات بصورت جداگانه در یک پست دیگه ارائه میشه)

دستاوردهای جدید در این حوزه :

Fractional Max Pooling روشی را جهت انجام عملیات pooling پیشنهاد میکند که در آن از فیلترهای کوچکتر از اندازه ۲×۲ استفاده میشود. این روش با تولید تصادفی نواحی pooling همراه با فیلترهایی با اندازه  ۱×۱ , ۱×۲ , ۲×۱ و یا ۲×۲ به منظور پوشش سطح نگاشت فعال سازی  انجام میشود. این Grid ها بصورت تصادفی در هر forward pass ایجاد میشوند و در زمان آزمایش (Test time) میتوان با میانگین گیری از چندین grid به تخمینی در این زمینه دست پیدا کرد .(state of the art دیتاست Cifar10 با این روش بدست اومده!)

Striving for Simplicity: The All Convolutional Net پیشنهاد حذف لایه pooing در ازای استفاده از معماری ای که در آن تنها از لایه های تکراری کانولوشن استفاده شده است را میدهد. به منظور کاهش اندازه تصویر, آنها استفاده از گام های بزرگتر در لایه کانولوشن را بصورت هر از چندگاهی, پیشنهاد میکنند.

بواسطه کاهش شدید در اندازه تصویر[۱] (که تنها برای دیتاست های کوچک برای کنترل با overfitting سودمند است) , گرایش مقاله ها به سمت حذف لایه Pooling در شبکه های کانولوشن جدید است.

(در زیر لیستی از لایه های جدید این حوزه رو میبینید اونهایی که توضیح ندارن و مابقی بعدا بروز میشن انشاالله )

لایه Normalization

تعداد زیادی لایه Normalization جهت استفاده در معماری های شبکه های کانولوشن پیشنهاد شده اند که بعضی اوقات بقصد پیاده سازی طرحهای بازداری [۲]که در مغز انسان مشاهده شده است بوده اند. اما این لایه ها اخیرا از مد افتاده اند چرا که در عمل میزان اثربخشی آنها حتی در صورت وجود بسیار ناچیز بوده است. [۳]

Lateral inhibitiondh یا همون بازداری جانبی, در بینایی برای افزایش شفافیت سیگنالهای ورودی به مغز مورد استفاده قرار میگیرن. در انتها هم این بحث بیشتر توضیح داده شده.

این بخش هم توضیحاتی هست که من در ایمیل در این باره به یکی از دوستانی که سوال کرده بودن در این رابطه دادم :

سلام
….
داستانش هم از این قراره که تو نوروبایولوژی (عصب شناسی) ما یه مفهومی داریم بنام Lateral inhibition که به فارسی شاید گفت منع جانبی . یعنی چی؟ این مفهوم به ظرفیت یک نورون برانگیخته شده برای بی اثر کردن(یا کاهش اثر) همسایه هاش اشاره داره.اساسا ما به یه افزایش قابل توجه نیاز داریم تا یه شکلی از ماکسیمای محلی داشته باشیم . این مسئله باعث ایجاد کنتراست در اون ناحیه میشه و بنابر این بلطبع باعث افزایش درک حسی(یا sensory perception) میشه. افزایش درک حسی چیز خوبیه برای همین هم در ابتدا در شبکه کانولوشن سعی در پیاده سازیش کردن .
این لایه این مفهوم رو که تازه صحبتش رو کردیم سعی میکنه پیاده کنه . این لایه زمانی که ما با نورونهای ReLU سرو کار داریم مفید هست دلیلش هم اینه که نورونهای ReLU فعالسازی های نامحدود (unbounded) دارن و ما به LNR نیاز داریم تا اوناو نرمالیزه کنیم . ما میخوایم ویژگی های فرکانس بالا با پاسخهای بزرگ رو کشف کنیم. اگه ما عملیات نرمالسازی رو در همسایگی محلی نورون برانگیخته انجام بدیم حساسیت بنسبت به همسایه هاش باز بیشتر میشه.  در همین زمان این کار باعث تعدیل  پاسخ هایی که بصورت یکنواخت بزرگ در هر همسایگی هستن میشه. اگه تمامی مقادیر بزرگ باشن نرمالسازی اونها باعث کاهش همه اونا میشه بنابر این ما میخوایم نوعی از inhibition یا بازداری رو ایجاد کنیم و نرونهای با برانگیختگی بزرگ رو تقویت کنیم.  این مساله توضیحش تو بخش ۳٫۳ مقاله کریژوسکی اومده (لینک)
اطلاعات بیشتر در مورد Lateral inhibition رو میتونید از اینجا بخونید
 من تو ترجمه inhibition scheme رو طرح های باز داری معناش کردم.

لایه تماما متصل (Fully Connected layer)

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

لایه Batch-Normalization:

لایه ELU:

لایه PReLU:

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

انجام عمل Forwarding در شبکه کانولوشن تبدیل شده برای یکبار بسیار بهینه تر از تکرار آن در شبکه کانولوشن اصلی در تمام ۳۶ مکان است چرا که این ۳۶ ارزیابی محاسبات مشترک دارند. این نکته اغلب در عمل برای بدست آوردن کارایی بهتر در زمانهایی که مثلا تغییر اندازه تصویر به تصویر بزرگتر رایج است مورد استفاده قرار میگیرد.نحوه استفاده به این صورت است که از یک شبکه کانولوشن تبدیل شده جهت ارزیابی امتیاز دسته ها در نقاط مکانی زیادی استفاده شده و سپس میانگین این امتیازات گرفته میشود.

سوال: اگر ما قصد این را داشتیم تا بطور بهینه ای شبکه کانولوشن اصلی را بر روی تصویر با stride کمتر از ۳۲ پیکسل اعمال کنیم آنوقت چطور میتوانستیم این عمل را به انجام برسانیم ؟  ما میتواتسنیم از چندیدن forward pass برای این منظور استفاده کنیم . بعنوان مثال دقت کنید اگر ما میخواستیم از stride با اندازه ۱۶ پیکسل استفاده کنیم ما میتوانستیم با ترکیب توده های دریافتی توسط عمل forwarding در شبکه کانولوشن تبدیل شده در دوبار این کار را انجام دهیم . بار اول آن را بر روی تصویر اصلی و بار دوم بر روی تصویری که ۱۶ پیکسل از لحاظ مکانی در راستای عرض و ارتفاع تغییر کرده است  اعمال کنیم .[۴]

ConvNet Architectures

تا به اینجای کار ما دیدیم که شبکه های عصبی تنها از سه لایه Conv , Pool (بصورت پیشفرض ما Max Pool را در نظر میگیریم مگر اینکه خلاف آن عنوان شود) و لایه FC (یا تماما متصل) تشکیل میشوند. همچنین ما تابع فعال سازی RELU را در قالب یک لایه که تابع فعال سازی را بر روی تک تک عناصر اعمال میکند در نظر میگیریم . در این بخش ما خواهیم دید که چگونه این لایه ها با یکدیگر ترکیب شده و یک شبکه عصبی کانولوشن را تشکیل میدهند.

Layer Patterns

رایجترین شکل یک معماری شبکه عصبی کانولوشن ترکیب چند لایه Conv-RELU است که بعد از آنها لایه های POOL قرار میگیرند و این قالب یا طرح انقدر تکرار میشود تا تصویر ورودی به اندازه دلخواه کوچک شود. معمولا در این زمان است که از لایه های تماما مرتبط استفاده میشود. آخرین لایه تماما متصل حاوی خروجی نظیر امتیاز دسته ها میباشد . به عبارت دیگر رایجترین معماری شبکه عصبی کانولوشن طرحی همانند زیر دارد :

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

که در اینجا   *نشانه تکرار و POOL? هم به معنای وجود یک لایه POOLing اختیاری است. معمولا مقادیر N,M و K بصورت  N>=0 (و معمولا N<=3 ) , M>=0 , K>=0 (و معمولا K<3) میباشند. در زیر شما میتوانید تعدادی از معماری های رایج شبکه کانولوشن را مشاهده کنید :

  • INPUT -> FC

معماری فوق یک کلاسیفایر خطی را پیاده سازی میکند.  در اینجا مقادیر  N = M = K  همگی برابر با ۰ هستند

  • INPUT -> CONV -> RELU -> FC
  • INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC

در اینجا نیز شاهد هستیم که هر لایه کانولوشن بین ۲ لایه POOLing قرار گرفته است

  • INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC

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

معمولا سعی کنید از ترکیب لایه کانولوشن با فیلتر کوچکتر نسبت به لایه کانولوشنی با اندازه ناحیه ادراکی(فیلتر) بزرگتر استفاد کنید. فرض کنید شما سه لایه کانولوشن با اندازه فیلتر ۳×۳ را با هم ترکیب میکنید (دقت کنید که بین این لایه ها هم لایه RELU وجود دارد) با این ترتیب هر نورون در لایه کانولوشن اول یک دید ۳×۳ از توده ورودی دارد . یک نورون که در لایه کانولوشن دوم قرار دارد یک دید ۳×۳ از لایه کانولوشن اول و به همین صورت یک دید ۵×۵ از توده ورودی دارد.به همین شکل یک نورون در لایه کانولوشن سوم یک دید ۳×۳ از لایه کانولوشن دوم دارد و از این جهت یک دید ۷×۷ هم از توده ورودی دارد. فرض کنید بجای این سه لایه کانولوشن ۳×۳ (منظور با اندازه فیلتر ۳×۳ است) ما فقط بخواهیم از یک لایه کانولوشن به همراه نواحی ادراکی با اندازه ۷×۷ استفاده کنیم . نورون های موجود در این لایه دارای اندازه ناحیه ادارکی خواهند بود که برابر با اندازه توده ورودی است (۷×۷) که البته این کار کاستی ها و مشکلاتی  نیز به همراه دارد. مشکل اول این است که در این حالت, نورون ها یک تابع خطی از ورودی را محاسبه میکنند در حالی که ترکیب سه لایه کانولوشن در حالت قبل ,یک تابع غیر خطی از ورودی را که باعث بیان بهتر ویژگی های ورودی میشود محاسبه میکند. دومین مشکل این است که اگر فرض کنیم تمام توده ها C کانال داشته باشند بنابر این یک لایه کانولوشن ۷×۷ تعداد image057 پارامتر خواهد داشت در حالی که سه لایه کانولوشن ۳×۳ تنها  image058پارامتر خواهند داشت. همانطور که دیدیم ترکیب لایه های کانولوشن با اندازه فیلتر کوچک در مقابل استفاده از یک لایه کانولوشن با اندازه فیلتر بزرگتر بما اجازه میدهد تا ویژگی های قدرتمندتر بیشتر را با پارامترهای کمتری از ورودی را بیان کنیم .  در حالت اول هم مشکلی که وجود دارد اگر قصد استفاده از backpropagation  را داشته باشیم نیاز به حافظه بیشتری نسبت به حالت دوم است

Layer Sizing Patterns

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

لایه ورودی (Input layer) ( که حاوی تصویر ورودی است ) باید چندین بار بر ۲ قابل تقسیم (پخش پذیر ) باشد. اعداد رایح در این زمینه شامل ۳۲ (مثلا تصاویر موجود در دیتاست CIFAR-10 ) 64 , 96 (مثل تصاویر موجود در دیتاست STL-10 ) و یا ۲۲۴ (مثل شبکه های ImageNet متداول) ,۳۸۴ و ۵۱۲ هستند.

لایه های کانولوشن باید از فیلتر هایی کوچک (مثل ۳×۳ و یا نهایتا ۵×۵ ) با Stride S =1 و خصوصا zero padding توده ورودی بصورتیکه لایه کانولوشن ابعاد مکانی (عرض و ارتفاع) توده ورودی را تغییر ندهد استفاده کنند. به عبارت ساده تر این به این معناست که زمانی که F=3 باشد استفاده از zero padding  با مقدار P=1 ابعاد اصلی ورودی را حفظ خواهد کرد. به همین ترتیب زمانی که F=5 باشد zero padding با مقدار P=2 باعث حفظ ابعاد ورودی خواهد شد . برای یک مقدار F  کلی , میتوان نشان مشاهده کرد که  باعث حفظ اندازه ورودی میشود.  اگر به هر دلیلی نیازمند استفاده از فیلترهایی با اندازه های بزرگتر باشیم (مثلا فیلترهایی با اندازه ۷×۷ ) , باید عنوان کنیم که تنها استفاده از این اندازه در لایه اول کانولوشن که مستقیما به تصویر ورودی نگاه میکند متداول است .

لایه های Pooling وظیفه downsample کردن یا کاهش دادن ابعاد مکانی (عرض و ارتفاع) ورودی را دارند. رایجترین تنظیمات برای این لایه استفاده از max pooling به همراه ناحیه ادراکی با اندازه ۲×۲ ( یعنی F=2) و stride با مقدار S=2 میباشد. توجه کنید که این پیکربندی لایه pooling باعث نابودی ۷۵% مقادیر در توده ورودی میشود ( بخاطر downsampling 2 عنصر هم در ارتفاع و هم درعرض ). یک پیکربندی کمتر متداول دیگر نیز وجود دارد که در آن از نواحی ادراکی با اندازه ۳×۳ و stride با مقدار S=2  استفاده میشود. استفاده از نواحی ادراکی با اندازه ای بزگتر از این مقدار در لایه pooling بسیار نادر است چرا که در این صورت این لایه بیش از حد پراتلاف خواهد شد( یعنی بیش از حد داده ها را حذف میکند) و معمولا این کار باعث بدتر شدن کارایی نیز میشود.

طرحی که در بالا مشاهده کردید از این جهت جذاب است که لایه های کانولوشن همگی اندازه مکانی ورودی خود را حفظ میکنند. در حالی که لایه های POOL به تنهایی مسئول کاهش اندازه توده ها هستند. در روش های دیگری که ما از stride هایی با مقادیر بیشتر از ۱ استفاده میکنیم و یا در لایه های کانولوشن از zero padding در ورودی استفاده نمیکنیم, لازم است که با دقت بسیار زیادی توده های ورودی در سرتاسر شبکه کانولوشن را تحت نظر داشته و اطمینان حاصل کنیم تمامی stride ها و فیلتر ها با همدیگر سازگار بوده و همخوانی داشته باشند و معماری شبکه کانولوشن بصورت متقارن و مناسبی بهم متصل باشد.

چرا باید از stride با مقدار  ۱ دریک لایه کانولوشن استفاده کرد؟

در عمل مقادیر کوچک stride بهتر عمل میکنند. علاوه بر آن همانطور که قبلا گفته شد, stride با مقدار ۱ بما اجازه میدهد تا وظیفه downsampling را به عهده لایه Pooling بگذاریم و لایه های کانولوشن به وظیفه خود که تبدیل توده ورودی از بصورت عمقی است  بپردازند.

چرا باید از padding استفاده کرد ؟

علاوه بر فایده حفظ اندازهای مکانی (عرض و ارتفاع) بعد از لایه های کانولوشن که قبلا هم به آن اشاره شد, انجام این کار در واقع باعث افزایش کارایی میشود.. اگر در لایه های کانولوشن در ورودی از zero padding  استفاده نمیکردیم, و تنها عمل کانولوشن را انجام میدادیم ,  در اینصورت اندازه تودهها بعد از هر لایه کانولوشن به میزان کمی کاهش می یافت و اطلاعات موجود در مرزها(ی بیرونی توده) بسیار سریع از بین میرفتند.

اعمال تغییرات با توجه به محدودیت های حافظه

در بعضی حالات, (خصوصا در ابتدای معماری های شبکه عصبی کانولوشن) میزان مصرف حافظه با قوانین ارائه شده در بالا بسرعت افزایش پیدا  میکند. بعنوان مثال فیلتر کردن یک تصویر با اندازه ۲۲۴x224x3 با سه لایه کانولوشن و ۶۴ فیلتر با اندازه ۳×۳ و zeropadding  برابر P=1 باعث ایجاد یک توده با اندازه ۲۲۴x224x64 خواهد شد. این میزان برابر با ۱۰ میلیون عدد و یا ۷۲ مگابایت حافظه (به ازای هر تصویر هم برای اعداد و هم گرادیانت آنها) است. از آنجایی که GPU های فعلی توسط حافظه bottleneck شده اند شاید نیاز به تغییراتی در این زمینه باشد. در عمل افراد ترجیح میدهند تا تنها تغییرات را در لایه کانلووشن اول شبکه اعمال کنند. بعنوان مثال, یک تغییر میتواند استفاده از فیلتر با اندازه ۷×۷ و  stride S=2 در لایه کانولوشن اول باشد ( همانطور که در شبکه ZF دیده میشود). نمونه دیگر AlexNet است که از فیلترهایی با اندازه ۱۱×۱۱ و Stride با مقدار S=4   در لایه کانولوشن اول خود استفاده کرد.

مطالعات موردی

در حوزه شبکه های کانولوشنی چندین معماری وجود دارد که نام اختصاصی دارند. معروف ترین آنها را در زیر مشاهده میکنید .

شبکه LeNet:

اولین کاربردهای موفقیت امیز شبکه های عصبی کانولشن توسط Yann LeCun در سال ۱۹۹۰ توسعه داده شدند. از میان آنها, معماری LeNet معروفترین آنهاست که برای خواند کدهای پستی , ارقام و… مورد استفاده قرار گرفته بود.

معماری AlexNet

اولین نمونه ای که شبکه های عصبی را در Computer Vision به محبوبیت رساند AlexNet بود. این معماری توسطAlex Krizhevsky , Ilya Sutskever  و Geoff Hinton توسعه داده شد. AlexNet در رقابت ILSVRC  در سال ۲۰۱۲ ارائه داده شد و توانست با اختلاف فاحشی نسبت به جایگاه دوم  به پیروزی برسد. این شبکه اساس معماری شبیه LeNet داشت با این تفاوت که عمیقتر, بزرگتر بود و همچنین از ترکیب چندین لایه کانولوشن با هم استفاده میکرد ( در گذشته یک لایه کانولوشن که بعدش یک لایه Pool قرار میگرفت رایج بود )

ZF

برنده رقابت ILSVRC 2013 شبکه کانولوشنی بود که توسط Matthew Zeiler و Rob Fergus توسعه پیدا کرده بود. بعدها این شبکه به نام ZF که مخفف نام توسعه دهندگان آن است معروف شد. این معماری ورژن بهینه شده ای از AlexNet بود که با تغییر فراپارامترهای معماری , بطور خاص با افزایش اندازه لایه های کانولوشن میانی این بهینه سازی انجام شده بود.

GoogLeNet

برنده رقابت ILSVRC 2014 هم شبکه عصبی کانولوشنی بود که توسط Szegedy et al از طرف گوگل توسعه داده شده بود . ویژگی جدیدی که این معماری عرضه کرده بود توسعه یک ماجول مفهومی (Inception Module ) بود که بشدت تعداد پارامترهای شبکه را کاهش میداد ( ۴ میلیون پارامتر را با ۶۰ میلیون پارامتر AlexNet مقایسه کنید!)

VGGNet

برنده جایگاه دوم در رقابت ILSVRC 2014 شبکه عصبی کانولوشنی بود که توسط Karen Simonyan و Andrew Zisserman توسعه داده شده بود که بعدها با نام VGGNet معروف شد.ویژگی جدیدی که این معماری عرضه کرده بود , این بود که نشان داد عمق شبکه یک مولفه حیاتی برای کارایی خوب است. ورژن نهایی بهترین شبکه آنها شامل ۱۶ لایه  CONV/FC و بصورت خوش آیندی یک معماری بشدت همگن  (homogeneous ) که تنها دارای فیلتر با اندازه ۳×۳ در لایه کانولوشن و فیلتر ۲×۲ در لایه pooling از ابتدا تا به انتها بود. بعدا مشخص شد که برخلاف قدرت کمتر دسته بندی نسبت به GoogLeNet , VGGNet در وظایف یادگیری انتقال چندگانه (Multiple transfer learning tasks) از GoogLeNet بهتر عمل میکند. بنابر این شبکه VGG در حال حاضر محبوبترین انتخاب برای Feature extraction از تصاویر است . بطور خاص مدل از پیش آموزش داده شده آنها برای استفاده در کتابخانه Caffe وجود دارد . یک کاستی این شبکه این است که حافظه مصرفی و تعداد پاراامتر بسیار زیادی دارد (۱۴۰ میلیون پارامتر )

توضیحات بیشتر VGGNET

VGGNet از لایه های کانولوشن با اندازه فیلتر ۳×۳ , stride برابر ۱ و  zero padding برابر P=1  و لایه های Pooling با اندازه فیلتر ۲×۲ با همراه stride برابر با S=2 و بدون هیچ zero paddingیی تشکیل شده است . در زیر ما اندازه هر تصویر در هر مرحله را ثبت میکنیم اینطور میتوانیم هم اندازه تصویر و تعداد کلی وزنها را تحت نظر داشته باشیم .

INPUT: [224x224x3]        memory:  ۲۲۴*۲۲۴*۳=۱۵۰K   weights: 0

CONV3-64: [224x224x64]  memory:  ۲۲۴*۲۲۴*۶۴=۳٫۲M   weights: (3*3*3)*64 = 1,728

CONV3-64: [224x224x64]  memory:  ۲۲۴*۲۲۴*۶۴=۳٫۲M   weights: (3*3*64)*64 = 36,864

POOL2: [112x112x64]  memory:  ۱۱۲*۱۱۲*۶۴=۸۰۰K   weights: 0

CONV3-128: [112x112x128]  memory:  ۱۱۲*۱۱۲*۱۲۸=۱٫۶M   weights: (3*3*64)*128 = 73,728

CONV3-128: [112x112x128]  memory:  ۱۱۲*۱۱۲*۱۲۸=۱٫۶M   weights: (3*3*128)*128 = 147,456

POOL2: [56x56x128]  memory:  ۵۶*۵۶*۱۲۸=۴۰۰K   weights: 0

CONV3-256: [56x56x256]  memory:  ۵۶*۵۶*۲۵۶=۸۰۰K   weights: (3*3*128)*256 = 294,912

CONV3-256: [56x56x256]  memory:  ۵۶*۵۶*۲۵۶=۸۰۰K   weights: (3*3*256)*256 = 589,824

CONV3-256: [56x56x256]  memory:  ۵۶*۵۶*۲۵۶=۸۰۰K   weights: (3*3*256)*256 = 589,824

POOL2: [28x28x256]  memory:  ۲۸*۲۸*۲۵۶=۲۰۰K   weights: 0

CONV3-512: [28x28x512]  memory:  ۲۸*۲۸*۵۱۲=۴۰۰K   weights: (3*3*256)*512 = 1,179,648

CONV3-512: [28x28x512]  memory:  ۲۸*۲۸*۵۱۲=۴۰۰K   weights: (3*3*512)*512 = 2,359,296

CONV3-512: [28x28x512]  memory:  ۲۸*۲۸*۵۱۲=۴۰۰K   weights: (3*3*512)*512 = 2,359,296

POOL2: [14x14x512]  memory:  ۱۴*۱۴*۵۱۲=۱۰۰K   weights: 0

CONV3-512: [14x14x512]  memory:  ۱۴*۱۴*۵۱۲=۱۰۰K   weights: (3*3*512)*512 = 2,359,296

CONV3-512: [14x14x512]  memory:  ۱۴*۱۴*۵۱۲=۱۰۰K   weights: (3*3*512)*512 = 2,359,296

CONV3-512: [14x14x512]  memory:  ۱۴*۱۴*۵۱۲=۱۰۰K   weights: (3*3*512)*512 = 2,359,296

POOL2: [7x7x512]  memory:  ۷*۷*۵۱۲=۲۵K  weights: 0

FC: [1x1x4096]  memory:  ۴۰۹۶  weights: 7*7*512*4096 = 102,760,448

FC: [1x1x4096]  memory:  ۴۰۹۶  weights: 4096*4096 = 16,777,216

FC: [1x1x1000]  memory:  ۱۰۰۰ weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)

TOTAL params: 138M parameters

همانطور که در شبکه های کانولوشنی متداول است , میبینید که بیشترین حافظه مصرفی در لایه های کانولوشن ابتدایی مصرف شده اند و بیشترین تعداد پارامترها نیز در لایه های تماما متصل آخر وجود دارند. در این مورد خاص, اولین لایه تماما متصل دارای ۱۰۰ میلیون وزن از ۱۴۰ میلیون وزن موجود در سراسر شبکه میباشد.

ResNet:(برنده رقابت ایمیج نت در سال ۲۰۱۵ با ۱۵۲ لایه)

NiN:

ملاحظات محاسباتی :

بزرگترین گلوگاهی که باید در زمان ساخت یک معماری شکبه کانولوشن مد نظر قرار دهید حافظه است . بسیاری از GPU های جدید حافظه ای با اندازه ۳, ۴ و ۶ گیگابایت دارند و تنها مدلهای معدودی دارای حافظه های بیشتری نظیر ۱۲ گیگابایت هستند که میتوان در این بین به سری تایتان ایکس شرکت انویدیا اشاره کرد. مواردی که در زیر لیست شده اند مهمترین منابع حافظه ای هستند که باید زیرنظر گرفته شوند.[۵]

اندازه توده های لایه میانی :

اینها تعداد اعداد در هر لایه کانولوشن و همچنین گرادیانت های(با اندازه مساوی) آنها هستند. معمولا بیشترین تعداد این مقادیر در لایه های ابتدایی شبکه کانلولشن ( لایه های کانولوشن اول) وجود دارد.  اینها بخاطر انکه برای backpropagarion مورد نیاز هستند نگهداری میشوند. اما یک پیاده سازی هوشمندانه که شبکه کانولوشن را تنها در زمان آزمایش اجرا میکنید, میتواند در اصل با ذخیره مقادیر فعلی در هر لایه و حذف مقادیر قبلی در لایه های پایینی  بشدت این مقدار را کاهش دهد.

اندازه پارامترها :

اینها همان اعدادی هستند که پارامترهای شبکه , گرادیانتهای آنها در زمان backpropagation و معمولا هم یک مرحله cache درصورتی که از momentum , Adagrad , و یا RMSProp استفاده میکنند را در خود نگه میدارند. بنابر این  حافظه ای که برای ذخیره سازی بردار پارامتر استفاده میشود معمولا باید حداقل با فاکتور ۳ یا عددی در این حدود ضرب شود.

هر پیاده سازی شبکه کانولوشن نیازمند نگهداری حافظه متفرقه مثل image data batches و شاید ورژن اافزایش یافته انها و… باشد .

زمانی که شما یک تخمین کلی از تمام مقادیر (برای خروجی نرونها, گرادیانت آنها و موارد متفرقه ) بدست اوردید . حال باید آنرا به گیگابایت تبدیل کنید . تعداد اعداد را گرفته و آنرا در ۴ ضرب کنید تا تعداد بایتهای مورد نیاز را بدست آورید ( چون هر عدد اعشاری در ۴ بایت ذخیره میشود و یا اگر از دابل استفاده میکنید در ۸ ضرب کنید ) و سپس چندیدن بار بر ۱۰۲۴ تقسیم کنید تا به مقدار حافظه به کیلوبایت , مگابایت و نهایتا گیگابایت برسید . اگر شبکه شما در حافظه جا نمیشود یک روش ابتکاری جهت جای دادن آن  کاهش اندازه batch است چرا که بیشترین میزان حافظه معمولا توسط  خروجی نرونها مصرف میشود.

بصری سازی آنچه شبکه عصبی کانولوشن یاد میگیرد

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

نمایش بصری (Visualizing) مقادیر فعال سازی و وزن های لایه اول :

مقادیر فعال سازی در لایه ها :

سرراست ترین روش نمایش بصری , نمایش مقادیر فعال سازی شبکه در حین forward pass است.  برای شبکه های ReLU , فعال سازی ها معمولا ابتدا بشکل لکه های متراکم شروع شده و بعد با ادامه پیدا کردن آموزش (training) این فعال سازی ها پراکنده تر و محلی تر میشوند. یک نکته بسیار مهم که در اینجا با نمایش بصری قابل مشاهده است, این است که بعضی نگاشتهای فعال سازی ممکن است تماما برای تعداد زیادی ورودی صفر باشند. که این به معنای فیلترهای از کار افتاده (dead filter) بوده و میتواند نشانه ای از overfitting باشد.

image061

image060

یک نمایش بصری از مقادیر فعال سازی در اولین لایه کانولوشن.
تصویر اول: نمایش بصری مقادیر فعال سازی در اولین لایه کانولوشن تصویر دوم: نمایش بصری مقادیر فعال سازی در پنجمین لایه کانولوشن در یک شبکه AlexNet آموزش دیده که در حال نگاه به تصویر یک گربه است هر مربع نمایش داده شده در بالا, یک نگاشت فعال سازی متناظر با تعدادی فیلتر است. توجه کنید که مقادیر این فعال سازی ها پراکنده ( بیشتر مقادیر صفر هستند که در این نمایش بصری بصورت سیاه نمایش داده شده اند) و محلی هستند.

فیلتر های لایه کانولوشن و تماما متصل (Conv/FC Filters):

روش دوم نمایش بصری وزنهاست. معمولا وزنها در لایه کانولوشن اول که مستقیما به مقادیر پیکسل های خام تصویر نگاه میکنند قابل تفسیرترین پارامتر هستند, اما نمایش بصری وزنهای عمیقتر(وزنها در لایه های عمیقتر شبکه) در شبکه هم ممکن است .  نمایش بصری وزنها به این دلیل مفید است چون که شبکه هایی که بخوبی آموزش دیده اند معمولا فیلترهای خوب و یکنواختی را بدون هیچ قالب نویزداری (noisy patterns) نمایش میدهند. قالب های نویزدار میتوانند نشانه شبکه ای باشند که به اندازه کافی آموزش ندیده است و یا احتمالا نشانه  regularization ضعیفی باشد که باعث overfitting شده است .

image063

image062

یک نمایش بصری از فیلترهای یادگرفته شده در لایه کانولوشن اول
تصویر اول : نمایش بصری فیلترها در لایه کانولوشن اول تصویر دوم : نمایش بصری فیلترها در لایه کانولوشن دوم یک شبکه AlexNet آموزش دیده. توجه کنید که وزن های لایه اول خیلی خوب و یکنواخت هستند که نشانه همگرایی خوب شبکه است. ویژگی های رنگی و سیاه و سفید (color/grayscale) به این دلیل با هم دسته بندی شده اند چون AlexNet دارای دو جریان پردازش جداگانه است که نتیجه آشکار این معماری این است که یک جریان ویژگی های سیاه و سفید فرکانس بالا را ایجاد کرده و جریان دیگر ویژگی های رنگی فرکانس پایین را ایجاد میکند. وزنهای لایه کانولوشن دوم به این اندازه(لایه اول) قابل تفسیر نیستند اما مشخص است که آنها هنوز هم یکنواخت, خوش فرم و عاری از هرگونه قالب نویزدار هستند.

بدست آوردن دوباره تصاویری که بصورت بیشنه ای یک نورون را فعال میکنند (Retrieving images that maximally activate a neuron)

یک روش دیگر نمایش این است که یک دیتاست عظیم از تصاویر را گرفته و شبکه را توسط این تصاویر تغذیه کنیم و در این حین , کنترل کنیم کدام تصاویر بعضی از نورون ها را بصورت بیشینه ای فعال میکنند. . ما سپس میتوانیم برای بدست اوردن درکی از انچه که نورون دارد بدنبال آن در ناحیه ادراکی خود میگردد با نمایش این تصاویر برسیم . یکی از این نمایش های بصری ( از میان سایر روشها), روشی است که در مقاله ” Rich feature hierarchies for accurate object detection and semantic segmentation  ” توسط Ross Grshick et al توضیح داده شده است.

image064

تصاویری که نورون های لایه Pooling پنجم در یک شبکه AlexNet را به بیشترین میزان فعال کرده اند. مقادیر فعال سازی و ناحیه ادراکی یک نورون مشخص با رنگ سفید نمایش داده شده است. (بصورت خاص, توجه کنید که نورون های لایه Pool5 (پنجمین لایه Pooling ) تابعی از یک قسمت نسبتا بزرگ از تصویر ورودی هستند ). میتوان دید که بعضی از نورون ها نسبت به بالا تنه, متن, و یا نقاط درخشان حساس هستند.(واکنش میدهند)

یک اشکال این روش این است که نورون های لایه ReLU الزاما هیچ معنایی به تنهایی ندارند. بلکه مناسبتر این است که چندین نورون لایه ReLU را بعنوان بردارهای اولیه (basis vectors) بعضی فضاها که نمایانگر پچ های تصاویر(image patches) هستند در نظر بگیریم . به عبارت دیگر,  نمایش بصری(visualization), در حال نمایش patchهایی که در لبه توده ای از تصاویر(at the edge of cloud of representation) , در راستای محورهایی (اختیاری) که متناظر با وزنهای فیلتر هستند, است. میتوان این مسئله را از این واقعیت مشاهده کرد که نورونها در شبکه کانولوشن بصورت خطی در فضای ورودی عمل میکنند بنابر این چرخش اختیاری فضا ممکن نیست. این نکته در مقاله ای بنام  Intriguing properties of neural networks  توسط Szegedy et al مورد بررسی بیشتر قرار گرفت که در آن آنها نمایش بصری مشابه ای را در راستای جهت های دلخواه در فضای نمایشی (تصویر) انجام دادند.

Embedding the codes with t-SNE

شبکه های عصبی کانولوشن را میتوان بعنوان تبدیل تدریجی تصاویر به نمایش هایی که در آن دسته ها (کلاسها) توسط یک کلاسیفایر خطی جدا شده اند, در نظر گرفت.  ما میتوانیم به ایده خوبی در باره توپولوژی این فضا با تعبیه تصاویر در دو بعد بصورتی که نمایش بُعد پایین  دارای فاصله های نسبتا یکسان نسبت به نمایش بُعد  بالای آنها است برسیم .  روش های تعبیه سازی زیادی توسعه داده شده اند که از بصیرت(intuition) تعبیه بُردارهای با بعد بلند در فضای با بعد کوتاه در حالی که فاصله های متقابل از هم حفظ شده اند استفاده میکنند. در میان آنها t-SNE یکی از معروفترین روشهایی است که نتایج از لحاظ بصری زیبایی را تولید میکند.

برای تولید یک تعبیه, ما میتوانیم مجموعه ای از تصاویر را گرفته و از شبکه عصبی کانولوشن برای استخراج کدهای CNN  استفاده کنیم .( مثلا در AlexNet بردار ۴۰۹۶ بعدی دقیقا قبل از کلاسیفایر (دسته بندی کننده), و بطور حیاتی شامل غیرخطی ReLU ) . ما سپس اینها را وارد یک t-SNE کرده و یک بردار دو بعدی برای هر تصویر بدست میاوریم. تصاویر متناظر سپس میتوانند در قالب یک grid به نمایش در آیند.

image065

تعبیه t-SNE مجموعه ای از تصاویر بر اساس کدهای CNN آنها.

  • تصاویری که در کنار هم قرار دارند در فضای نمایش CNN هم بهم نزدیک هستند, که به معنای آن است که CNN آنها را بسیار شبیه به هم “میبیند”. دقت کنید که شباهت اغلب مبتنی بر کلاس (دسته) و معنایی بوده تا مبتنی بر رنگ و پیکسل. برای اطلاعات بیشتر در چگونگی تولید این نمایش , سورس کد آن و نمایش های مرتبط بیشتر در مقیاس های متفاوت به [۶]t-SNE visualization of CNN codes. مراجعه کنید.

مسدود سازی بخشهایی از تصویر

فرض کنیدکه یک شبکه عصبی کانولوشن تصویری را بعنوان تصویر یک سگ دسته بندی میکند. حالا یک سوال مهم, ما چطور میتوانیم مطمئن باشیم که شبکه در اصل دارد سگ را انتخاب میکند و نه اطلاعات محتوایی از پس زمینه و یا اشیاء دیگری در تصویر را؟ به عبارت دیگر چطور مطمئن شویم که شبکه واقعا سگ را شناسایی کرده و صرفا جواب دسته بندی آن بخاطر وجود اطلاعات دیگری در تصویر نیست ؟ یک راه برای فهمیدن اینکه پیشبینی شبکه از کدام بخش از تصویر دارد می آید این است که احتمال دسته دلخواه (در اینجا دسته سگ ها) را بعنوان یک تابع از مکان یک شی مسدود شده رسم کنیم . این یعنی اینکه ما بر روی نواحی مختلف تصویر حرکت کرده و یک پچ را بر روی تصویر قرار دهیم که تمام آن ناحیه را برابر صفر قرار دهد.و بعد به احتمال کلاس نگاه کنیم . ما میتوانیم احتمال را بصورت یک نقشه گرمایی (heat map) 2 بعدی نمایش دهیم . این روش در مقاله Mathew Zeiler با عنوان Visualizing and Understanding Convolutional Networks آمده است .

image066

سه تصویر ورودی (در بالا) و heatmap های متناظر با هر کدام (در پایین)

  • دقت کنید که ناحیه مسدود کننده بصورت خاکستری نشان داده شده است. در همان حین که ما مسدود کننده را بر روی تصویر حرکت میدهیم (میلغزانیم/اسلاید میکنیم) احتمال کلاس صحیح را نیز ثبت کرده و سپس آنرا بصورت یک heatmap ( که در زیر هر تصویر نمایش داده شده است) نمایش میدهیم. بعنوان مثال در سمت چپ ترین تصویر ما میبینیم که احتمال تصویر سگ Pomeranian  زمانی که مسدود کننده صورت سگ را میپوشاند کاهش پیدا میکند و اینطور ما بسطحی از اطمینان میرسیم که در اصل این صورت سگ است که باعث امتیاز بالای دسته بندی میشود. حال بطور برعکس , میبینیم که صفر کردن بقیه نواحی تصویر تاثیر نسبتا ناچیزی در امتیاز کلاس دارد که باز موید نتیجه قبلی است . یعنی صورت سگ مسئول بیشترین امتیاز کسب شده تصویر برای دسته بندی بوده و مابقی اجزای تصویر تاثیر بسیار ناچیزی در امتیاز مورد نظر داشته اند.

[۲] inhibition  schemes

[۳] برای اطلاعات بیشتر در این زمینه میتوان به Cuda-convnet Library API آقای Alex Krizhevsky مراجعه کرد.

[۴]  میتوانید نحوه انجام این تبدیل را در عمل در قالب کد (با استفاده از کتابخانه Caffe ) در Net Surgery مشاهده کنید.

[۵] با ورود نسل جدید کارتهای گرافیکی انویدیا در معماری پاسکال ما شاهد افزایش حجمی حافظه و همینطور کارایی این کارتها در حوزه یادگیری عمیق و خصوصا محسابات مورد نیاز شبکه کانولوشن هستیم. در زمان بروز آوری این نگارش کارتهای GTX1070,GTX1080 با ۸ گیگابایت رم از سری جدید معرفی شده اند (اما هنوز به بازار وارد نشده اند)

[۶]  http://cs.stanford.edu/people/karpathy/cnnembed/

توضیحات Lateral inhibition

در مورد local response normalization یک مطلبی تو یکی از وبلاگها قبلا دیده بودم که اینجا نقل به مضمونش رو گذاشتم جالب توضیح داده (لینکش رو پیدا کردم قرار میدم الان یادم نمیاد کجا بود) در زیر هم ترجمه Lateral inhibition رو از ویکی پیدیا رو گذاشتم اینم بگم که مطلب زیردر ویکی پیدیا با تصاویر بخوبی نمایش داده شده که دیدنش خالی از لطف نیست. اینم بگم که لایه normalization که بالا توضیحش اومده بعنوان مثال تو دیتاست ImageNet طبق گزارش اومده در مقاله VGGNet تاثیر (چندانی) نداشته برای همین در مدل VGGNet بعنوان مثال استفاده نشده . (این مدل مقام دوم کلسیفیکیشن ایمیج نت و مقام اول دیتکشن رو کسب کرده در سال ۲۰۱۴)

بازداری بصری یا Visual Inhibition
lateral inhibition یا بازداری جانبی باعث افزایش کنتراست و شفافیت (sharpness) در پاسخ بصری میشود. این پدیده بعنوان مثال در شبکیه چشم پستاندارن رخ میدهد.در تاریکی یک محرک نوری کوچک باعث بهبود فوتو ریسپتورها (rod cells یا سلولهای میله ای)ی مختلف میشود.
سلولهای میله ای در مرکز محرک نوری سیگنال “روشن” را به مغز منتقل میکنند در حالی که سلولهای میله ای دیگر در خارج محرک سیگنال “تاریک” را به مغز ارسال میکنند.این تفاوت بین روشنایی و تاریکی باعث ایجاد تصویری شفافتر(sharper) میشود. این مکانیزم همنچنین باعث ایجاد اثر بصری باند ماخ (Mach Band) میشود.
بازداری جانبی بینایی (Visual Lateral inhibition) فرایندی است که در آن سلولهای فوتو ریسپتور به مغز در درک تفاوت موجود در یک تصویر کمک میکنند. نور الکترومغناطیسی وارد چشم شده و سپس از قرنیه مردم و سپس لنز چشم عبور کرده و سپس از سلولهای ganglion,amacrine,bipolar و سلولهای افقی گذشته تا به سلولهای میله ای فوتو ریسپتور که نور را جذب میکنند برسد. این سلولهای میله ای بوسیله انرژی موجود در نور تحریک شده و یک سیگنال عصبی محرک را به سمت سلولهای افقی آزاد میکند .
سیگنال محرک اما تنها از طریق سلولهای میله ای در مرکز ناحیه ادراکی سلول Ganglion قابل انتقال است چرا که سلولهای افقی با ارسال یک سیگنال بازداری به سلولهای میله ای همجوار برای ایجاد توازنی که به پستاندارن اجازه درک تصاویر واضح تر را میدهد پاسخ میدهند.
سلولهای ganglion شبکیه کماکان یک پاسخ عصبی محرک را تنها از سلول میله ای مرکزی دریافت خواهند کرد. سلول میله ای مرکزی پاسخ عصبی محرک خود را مستقیما به سلولهای bipolar ارسال میکند این سلولها هم سپس این سیگنال را به سمت سلولهای ganglion باز ارسال میکنند._سلولهای bipolar نقش رله را ایفا میکنند)
بازداری ایجاد شده توسط سلولهای افقی باعث ایجاد سیگنال متوازن تر و متمرکز تری برای سلولهای ganglion شبیکه  میشود که متعاقبا به کورتکس سلبرال از طریق عصب بینایی ارسال میشوذ.

توضیحات در مورد Convolve:

یک توضیح مهم اینه که convolve به معنای ضرب نقطه به نقطه نیست .در اصل به معنای ضرب پیچشی هست (با تشکر از سرکار خانوم سلیمیان که معادل فارسی رو لطف کردن). عملیات کانولوشن یعنی ضرب مولفه به مولفه یا همون عنصر به عنصر دوماتریس با هم (در اینجا ناحیه ادراکی از ورودی با ماتریس وزن که ما بهش میگیم فیلتر ) نکته ای که باید دقت کنید اینه که در تعریف کانولوشن یکی از دو ماتریس جای سطر و ستونهاش برعکس میشه و بعد بین ماتریس حاصل و ماتریس اول ضرب مولفه به مولفه انجام میشه) و سپس جمع همه عناصر ماتریس حاصل با هم . یعنی وقتی دو ماتریس با هم ضرب شدن بصورت مولفه به مولفه یک ماتریس سوم حاصل میشه (آموزش شبکه کانولوشن بخش دوم – بخش انتهایی اون رو ببینید جایی که ۱۰ ۲۰ تا تصویر من گذاشتم! ) . حالا درایه های ماتریس سوم رو با هم جمع باید کرد این میشه عملیات کانولوشن که تو درس computer vision بچه ها میخونن و ازش تو کارهای مختلف استفاده میکنن.

نکته مهم بعدی اینه که شما تو آموزش بالا و همینطور احتمالا ۱۰۰ درصد بقیه اموزشهای یادگیری عمیق میبنید که خبری از برعکس کردن یا بهتر بگم چرخش (flip)سطر و ستون نمیبینید! هرچی هست خیلی معمولی تو ماتریس رو مولفه به مولفه ضرب و بعد هم درایه ها رو با هم جمع میکنن و بعنوان خروجی ارائه میکنن. دلیل این مساله اینه که کاری که در اصل اینجا اتفاق داره میوفته کانولوشن نیست! correlation هست. کاری که ما داریم میکنیم اینجا discrete correlation بهش میگن که تو شبکه های عمیق نتیجه معادل discrete convolution رو بما میده . برای همین تقریبا همه کتابخونه ها و چارچوبهایی که تو این حوزه دارن کار میکنن کانولوشن رو بصورت correlation پیاده سازی میکنن.
(برای درک بهتر کانولوشن در حالت کلی میتونید اینجا و اینجا رو هم ببینید)

من هم تو متن برای اینکه هی convolve رو تکرار نکنم و احیانا باعث گیج کردن کسی نشم بجاش از کلمه ضرب نقطه ای (و بعد جمع!) استفاده کردم. حالا اگه معادل بهتری براش میشناسید به فارسی لطفا راهنمایی کنید تا متن ویرایش بشه.

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

بحش دوم

سید حسین حسن پور متی کلایی

درباره ی سید حسین حسن پور متی کلایی

موسس و مدیر سایت. اطلاعات در مورد فعالیت های کاری و تحصیلی : linkedIn . برای ارتباط از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

42 دیدگاه در “آموزش شبکه کانولوشن بخش سوم

  1. یک توضیح مهم اینه که convolve به معنای ضرب نقطه به نقطه نیست . عملیات کانولوشن یعنی ضرب مولفه به مولفه یا همون عنصر به عنصر دوماتریس با هم (در اینجا ناحیه ادراکی از ورودی با ماتریس وزن که ما بهش میگیم فیلتر) و سپس جمع همه عناصر ماتریس حاصل با هم . یعنی وقتی دو ماتریس با هم ضرب شدن بصورت مولفه به مولفه یک ماتریس سوم حاصل میشه (آموزش شبکه کانولوشن بخش دوم – بخش انتهایی اون رو ببینید جایی که ۱۰ ۲۰ تا تصویر من گذاشتم! ) . حالا درایه های ماتریس سوم رو با هم جمع باید کرد این میشه عملیات کانولوشن که تو درس computer vision بچه ها میخونن و ازش تو کارهای مختلف استفاده میکنن.

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

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

  3. سلام.
    درباره شبکه عصبی کانولوشنی ، چند تا سوال داشتم. فقط امیدوارم زود جواب بدید ، چون متاسفانه فرصتم خیلی کم هست. تشکر.

    ۱- در شبکه عصبی کانولوشنی چند لایه کانولوشن و پولینگ پشت هم قرار می گیرند. و : هر کرنل با لایه قبل کانوالو میشه و در تابع فعالسازی قرار داده میشه و فیچر مپ خروجی رو تولید میکنه. // من جاهای مختلف در مورد این شبکه دیدم که تابع فعالساز بعد از دو لایه (کانولوشن و پولینگ / دوباره : کانولوشن و پولینگ ، که اینجا اصلا فعالساز استفاده نکرده) تازه یعد از لایه بعدی کانولوشن اومده تابع فعالساز استفاده کرده ؟ (من اینو هم تو مقاله ها و حتی تو یه کد دیدم) برای جای سوال هست که آیا در لایه های اول تایع فعالساز استفاده نمیشه و نیازی نیست ؟ یا استفاده میشه ؟

    ۲- و یه سوال دیگه که برام پیش اومده اینه که اگر من کدی بنویسم برای این شبکه ،آیا میشه وقتی کد اجرا میشه فهمید که تعداد ویژگی هر بار که بعد از کانولوشنی کاهش پیدا میکنه ، تعداد ویژگی هامون چند تا میشه؟ یا نمیشه و فقط باید در توضیحات گفت که تعداد ویژگی لایه کانولوشن بعد از استفاده از لایه پولینگ ، کاهش پیدا میکنه ، اما ما نمیتونیم دقیقا متوجه بشیم تعداد ویژگی رو نمیتونیم با عدد بگیم که این مقدار شده ؟

    ۳- دسته بندی تو این شبکه با ویژگی های استخراجی از آخرین لایه کانولوشنی انجام میشه… من برای مقایسه با سایر الگوریتم ها ، باید بیام تعداد ویژگی رو کاهش بعد بدم. درسته ؟ یه سوال که برام ایجاد میشه اینه که وقتی من با تعداد ویژگی های مختلف مثلاً ۵۰ ، ۱۰۰ ، ۱۵۰ شبکه رو تست میکنم با الگوریتم های مثل ماشین بردار پشتیبان و پارامترهای ارزیابی مثل حساسیت و … رو بدست میارم ، الان سوالم اینجاست البته یکم از شبکه کانولوشنی فاصله گرفتم! ببنید ما میگیم هر چقدر تعداد ویژگی بیشتر باشه کارایی دسته بندی بالاتر میره.. خب اگه این در همه پارامترهای ارزیابی اینطور نباشه ، یعنی هر چقدر تعداد ویژگی ما بیشتر بشه امتیاز پارامترهای ارزیابی ما صعود نکنه بلکه نزول کنه ، این چرا اینطور میشه؟

    ۳- من میخوام برای پروژه ام ساختار شبکه کانولوشنی رو مثل مقاله ها ، داشته باشم .. همون ساختاری که کانولوشن ، پولینگ ، و fully connected هست … این ساختار رو من با چه نرم افزاری میتونم رسم کنم و در پروژه ام بذارم ؟ (چون صددرصد این ساختار در اجرای کد مربوط به این برنامه تولید نمیشه)

    1. سلام.
      ۱٫نه این ربطی به این نداره.معمولا شما همیشه بعد کانولوشن تابع فعال سازیش رو قرار میدید مگه اینکه بجای یکبار بخوایید به هر دلیلی چندبار عمل کانولوشن صورت بگیره.
      اونایی که میبینید این کارو کردن صرفا دنبال انجام عمل کانولوشن بودن.یعنی بجای اینکه یکبار عمل کانولوشن رو در ورودی انجام بدن چندبار این کارو کردن و بعد بعد کاهش بعد دادن و نهایتا تابع فعال سازی رو لحاظ کردن. (Lenet5 که نمونه اولیه شبکه کانولوشن بود مثلا اینطورعمل کرد)
      ۲٫بعد لایه کانولوش اگه لایه پولینگ قرار بدید (یا حتی تو خود لایه کانولوشن اندازه فیلتر رو بزرگتر کنید) کاهش ابعاد رو داریم. ویژگی هایی که شما ازش صحبت میکنید همون پارامترهای قابل یادگیری هستن که در هر زمانی میتونید محاسبه کنید.
      ۳٫من متوجه نشدم این بخش رو
      ۴٫اون ساختار رو میتونید با نرم افزارهای مختلف هم بسازید دستی و هم میتونید اگر مثلا از Caffe استفاده میکنید از اسکریپت خود Caffe و یا این سایت استفاده کنید.

      1. ممنون از پاسخ هاتون.
        ۱- در مورد stride ، مقدار stride رو در لایه های کانولوشن برابر با ۱ قرار می دیم تا وظیفه کاهش سایز fetaure map رو بذاریم به عهده لایه pooling. در لایه های بعدی کانولوشن که دیگه لایه pooling نداریم بلکه تابع فعالساز relu داریم که روی تک تک لایه ها ( منظور از لایه ها همون feature map هست. درسته؟ ) اعمال می کنیم ، باید مقدار stride ور بیشتر بذاریم مثلاً برابر با ۲٫ تا وظیفه کاهش سایز feature map درست انجام بشه. درست میگم؟

        ۲- در مورد padding اگه مقدارش برابر با صفر باشه ، به چه معنی هست؟

        تشکر.

        1. سلام
          خواهش میکنم .
          ۱٫من متوجه نشدم .یعنی چی “در لایه های بعدی کانولوشن که دیگه لایه پولینگ نداریم…”
          ببینید هر لایه کانولوشن یه تعداد کانال یا خروجی داره که شما میتونید برای کاهش ابعاد این توده سه بعدی از pooling استفاده کنید و یا حتی با اعمال اندازه فیلتر و استراید بزرگتر در لایه کانولوشن این کار رو صورت بدید.
          لایه پولینگ یک توده سه بعدی رو دریافت میکنه و اندازه اونو کاهش میده . به همین شکل لایه relu روی یه توده سه بعدی اعمال میشه (در اصل روی تک تک مولفه ها اعمال میشه) و یه توده سه بعدی بعنوان نتیجه ارائه میکنه.
          در ادامه شبکه این دست شماست که کاهش ابعاد رو داشته باشید یا نه چه با پولینگ چه با لایه کانولوشن. یادتون باشه یکی از مهمترین دلیلی که ما از کاهش ابعاد استفاده میکنیم کاهش پارامترهای محاسباتی هست.

          ۲٫اینجا توضیح داده شده : http://deeplearning.ir/آموزش-شبکه-کانولوشن-بخش-دوم/

  4. با عرض سلام و خسته نباشید
    من به تازگی شروع به مطالعه شبکه های کانولوشن کردم و به دنبال یک کد ساده در متلب هستم تا بتونه مثلا با استفاده از شبکه های کانولوشن یک پروژه کوچکی رو انجام بده مثلا تشخیص چهره یا دستخط یا ….، هدفم ازین کار تسلط بیشتر به جزییات این شبکه به صورت عملی هست . به طور خاص یک فایل زیپ را از لینک زیر دانلود و سعی در اجرای اون کردم:
    http://www.robots.ox.ac.uk/~vgg/practicals/cnn/
    ولی با خطای زیر مواجه شدم :
    Attempt to execute SCRIPT vl_nnconv as a function:
    C:\Users\mohsen\Downloads\Compressed\practical-cnn-2015a\matconvnet\matlab\vl_nnconv.m

    Error in exercise1 (line 20)
    y = vl_nnconv(x, w, []) ;
    به عبارت دیگه ام فایل بالا را نمیشناسه …با مراجعه به این برنامه متوجه شدم تمامی خطوط آن به صورت کامنت هست یعنی به رنگ سبز و هیچ خطی برای اجرا وجود ندارد. ممنون میشم اشکال به وجود امده را برام توضیح بدین …….ایا مشکل در برنامه هست یا در نحوه اجرای من؟ من این فایلها رو به مسیر متلب اضافه کردم و کار خاص دیگه ای انجام ندادم ….ایا نیاز به کامپایل داره یا اینکه مثلا تولباکس متکانونت را قبلش باید نصب کنم؟…..داخل این فایل فشرده پوشه ای به نام متکانونت هست و فکر میکنم نیازی به اینکار نباشه…..
    همچنین اگه کدی در متلب سراغ دارین که مثلا خودتون یا یکی از دوستانتون نوشته و پروژه ای را با استفاده از شبکه های کانولوشن انجام میده ممنون میشم در اختیار من قرار بدید.
    یه سوال دیگه….برای کار در زمینه شبکه های کانولوشن استفاده از متلب بهتره یا زبان دیگه ای را مثل پایتون پیشنهاد میدین؟….من با متلب کار کردم ولی با زبانهای دیکه هیچ آشنایی ندارم…..پیشاپیش از توجه تون متشکرم

    1. سلام .
      من متاسفانه با لینکی دادید کار نکردم. اما نگاهی که کردم بنظرم اومد مراحل متختلف رو توضیح دادن و همون پیش برید باید جواب بگیرید.
      مت کانونت بنظر من برای استفاده ازش نیاز نصب به تولباکسش بود ولی مطمئن نیستم چون کار نکردم باهاش.
      در مورد متلب و دیپ لرنینگ باید بگم استفاده خاصی نداره و تو این حوزه بدون شک زبان پایتون هست که بشدت استفاده میشه و بعدش هم سی++ و لوا (که مختص تورچ هست) . متلب اونم خیلی ضعیف توسط بعضی از فریم ورکهای مشهور پشتیبانی میشه مثل CAFFE . تورچ هم خیلی وقته که پشتیبانی از متلب رو کنار گذاشته . بدون استثنا تمامی فریم ورکهای معروف تو این زمینه رپر پایتون ارائه کردن و بشدت هم پشتیبانی میشه ازش.
      منم پیشنهاد میکنم متلب رو کنار بزارید و استارت کارتون رو با پایتون بزنید. از لحاظ سینتکس خیلی به متلب شبیه هست و خیلی سریع بنظرم میتونید استارت بزنید.
      برای شروع میتونید از CAFFE استفاده کنید که نیازی به یک خط برنامه نویسی هم نداره . میتونید مدلتون رو طراحی کنید پارامترها رو تغییر بدید و شبکه رو اموزش بدید و خروجی کار رو ببینید . آموزش کار با CAFFE تو سایت هست.
      اگر قصد برنامه ریزی بلند مدت دارید پیشنهاد میکنم برید سراغ تورچ یا تنسور فلو (مگه اینکه اختصاصی با شبکه های کانولوشن بخوایید کار کنید که CAFFE کماکان میتونه گزینه خوبی باشه ولی تورچ باز پیشنهاد میشه خیلی)
      اگه بک گراند جاوا دارید یا با اون راحت ترید فریم ورک DeepLearning4J هم خیلی عالیه و مستندات خیلی خوبی داره و میتونید ازش استفاده کنید.

  5. با سلام از شبکه های عصبی کانولوشن در موارد غیر کارهای تصویری هم استفاده میشود؟
    برای مثال مانند شبکه های عصبی معمولی در پیش بینی سری های زمانی هم میتوان از آن استفاده کرد؟

  6. با سلام و تشکر از توضیحات خیلی مفیدتون. من مطالب دانشگاه استنفوردم خوندم مطالب شمارم. ممنونم شما با زبانی ساده تر و کاملتر توضیح فرمودید. یه چن تا جا دچار گیجی شدم. میشه زود جواب سوالاتمو بدید با اینکه شمام خیلی درگیرید!!!
    ۱-بعد از هر کانولوشن قبل رفتن به لایه ی پولینگ یه تابع فعالسازی relu انجام میشه. بله؟ خوب این تابع چرا هر بار بین دو تا لایه باید انجام بشه؟
    ۲- توی هر لایه ی کانولوشن ما در واقع بک پراپگیشن رو انجام میدیم؟ تا آخرین لایه ی کانولوشن بله؟ و آیا هر کدوم از بک پراپگیشن ها در واقع فاز train هستش؟ یا آخرین بک پراپگیشن همون train اصلیمونه؟
    ۳- بعضی جاها آخرین لایه ی کانولوشن که داره میچسبه به فول کانکشن رو گفتن hidden layer آیا این درسته؟ مگه همه ی لایه هایی که از ورودی تا خروجی میزاریم جزو hidden layer نیستن؟
    ببخشید سوالاتم زیاده ولی این سوالا منو سردرگم کرده. و میشه مطلب بک پروپگیشن اینکه چه جوری توی شبکه های CNN کلا چه جوری انجام میشه رو هم به زودی قرار بدید؟

    1. سلام
      ۱.relu ‌یه تابع فعال سازی هست که استفاده از relu‌ باعث ایجاد nonlinearity‌بهتر شبکه میشه. اگر شما relu‌رو بردارید میبینید سرعت همگرایی شبکه بشدت کاهش پیدا میکنه.(یعنی هیچ تابع فعال سازی ای نباشه بین لایه ها) و اگر عمق شبکه هم زیاد باشه و از روشهای جدید استفاده نکنید اموزش شبکه های خیلی عمیق ممکن نیست. میتونید از توابع فعال سازی دیگه هم استفاده کنید. این تابع مثل تابع sigmoid‌یا tanh‌در شبکه های عصبی معمولی هست که ضرب وزن ها در ورودی ها وارد اون میشد و یک خروجی تولید میکرد (تابع فعال سازی) (البته مزایای relu بیشتره (نسبت به نمونه هایی مثل tanh‌و sigmoid اما در ساده ترین شکل چیزی که عرض کردم هست)
      ۲.عمل بک پراپ از انتهای شبکه شروع میشه و تا ابتدای شبکه انجام میشه لایه به لایه و پارامترها بر این اساس تنظیم میشن . این عمل جزءی از عملیات ترینینگ بحساب میاد
      ۳.من یادم نمیاد به این برخورده باشم ولی اگر کسی این حرف رو زده احتمالا منظورش این بوده که لایه های قبلی بعنوان یه فیچر اکسترکتور استفاده شدن و لایه های تماما متصل اخر رو یک شبکه عصبی در نظر گرفته که از اون ویژگی ها داره استفاده میکنه . باید منظور دقیق رو از اون کسی که این حرف رو میزنه بپرسید منظورش چی بوده .
      ۴. خیلی وقته در نظر دارم این کارو انجام بدم منتها بخاطر مشغله هی عقب می افته . انشاالله سعی میکنم زودتر این کارو انجام بدم .

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

    1. بک پراپگیشن در شبکه های عصبی معمولی هم هست! انتهای شبکه یعنی آخرین لایه شبکه حالا هرچی که میخواد باشه از اونجا شروع میشه گرادیانتها محاسبه میشن و به همین شکل لایه به لایه به عقب بر میگرده . حالا ممکنه یکی در میون لایه fully connected یا کانولوشن باشه فرقی نمیکنه در هر کدوم بک پراپگیشن انجام میشه .
      من فعلا وقت نمیکنم اما سعی میکنم زمانی که بک پراپ در شبکه کانولشون رو میخوام توضیح بدم اینم در نظر بگیرم (البته اگه یادم نره)
      اما تا اون زمان یه مثال از بک پراپ در آموزش شبکه کانولوشن دانشگاه استنفورد هست که خیلی قشنگ توضیح داده و میتونید استفاده کنید . تصویری هم هست.

  8. سلام
    ممنون بابت اطلاعات خوبی که در سایتتان گذاشتید.من دو سوال دارم.
    ۱- امکانش هست یه توضیحی در مورد شبکه های دکانولوشن بدید .
    ۲- تاجاییکه من متوجه شدم شبکه های کانولوشن استخراج ویژگی می کند و در قسمت لایه تماما متصل در واقع نقش همان شبکه های عصبی معمولی رادارد.درکل یعنی ویژگی های استخراج شده در کانولوشن وارد شبکه این لایه تماما متصل شده و طبقه بندی انجام میشود. مشکل من اینجاست من هنوز درک نمیکنم. نحوی دادن داده ترین (train)برای آموزش این شبکه به چه نحو است.ما یکسری ماتریس داریم که در واقع ویژگی های ماهستند که از بخش کانولوشن تولید شده و حالا ما باید یکسری سمپل مشخص کنیم که به عنوان داده آموزشی که نوع کلاس آنها مشخص باشد تا شبکه آموزش ببیند.الان با این ویژگی های تولید شده چطور اینکار صورت میگیرد و اصلا مگه مکان این سمپل ها مشخص هست که بگوییم مقدار ویزگی های تولید شده از کانولوشن چیست؟ درحالیکه در شبکه عصبی معمولی برای اموزش دقیقا مکان و نوع کلاس اون پیکسل آموزشی مشخص میشد و بعد با توجه به برداری ویژگی هر کلاس شبکه آموزش میدید.
    امکانش هست توضیح بیشتری در این زمینه بدید.متاسفانه هیچ منبعی توضیح دقیی در این زمینه نداده و من خیلی عجله دارم. متشکرم

    1. سلام .
      من انشاالله سرفرصت یه پست اختصایصی در مورد اینها میزنم . فعلا همینقدر بدونید که از این لایه برای upsampling استفاده میشه و برخلاف اسمش عمل عکس کانولوشن رو انجام نمیده! بهش میگن ۱/۲ strided convolution یا convolution transpose و یا upconvolution .
      اگه لکچر ۱۳ دانشگا استنفورد رو ببینید کامل در این مورد توضیح داده شده .
      ۲٫ من اصلا متوجه نشدم ! لطفا یکم واضح تر بفرمایید سوالتون رو.

  9. با سلام
    با تشکر فراوان از مطالب فوق العادتون من برای دومین دفه دارم مطالبتون رو میخونم با وجود اینکه یادگیری ماشین و پردازش تصویر و بینایی ماشین اصلا نمیدونستم و شبکه عصبی خیلی خیلی محدود اطلاع داشتم ولی مطالبتون واقعا کمکم کرد . جسارتا من چندتا سوال داشتم که تو چند کامنت میپرسم
    ۱- ممکنه این اصطلاحات رو ولو کوتاه توضیح بدید :
    ۱-گرادیانت
    ۲-بک پروپگیشن
    ۳-feed forward
    ۴-back forward
    ۵-forward pass
    ۶-forwarding
    البته تا حدودی مفهوم بعضیاش رو از مطالبتون فهمیدم ولی لطف کنید یه توضیح مختصر بدید ممنون میشم

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

      1. سلام مجدد
        بینهایت سپاس گذارم
        FORWARDING تو این متن اینجاها اومده بود
        این به معنای کاهش ۳۲ برابری است , بنابر این forwarding یک تصویر ۳۸۴×۳۸۴ پیکسلی در یک معماری تبدیل شده , همان توده را با اندازه ۱۲x12x512 نتیجه خواهد داد
        نجام عمل Forwarding در شبکه کانولوشن تبدیل شده برای یکبار بسیار بهینه تر از تکرار آن در شبکه کانولوشن اصلی در تمام ۳۶ مکان است چرا که این ۳۶ ارزیابی محاسبات مشترک دارند.

  10. یه چند تا سوال دیگه هم داشتم اگر لطف کنید راهنماییم کنید
    ۱-Lateral inhibitiondh رو تا حدودی متوجه شدم البته نحوه عملکردش رو نه به نظرم نتیجه این وضوح بالاتر تصویره تو شبکیه چشمه ولی کاربرد این تو شبکه های کنولوشن نفهمیدم چیه ؟ آیا یه لایه مجزاس ؟
    ۲- این سه تا لایه Batch-Normalization ، ELU ، PReLU فقط اسم بردید اگر ممکنه توضیحی راجبشون بدید که اصلا چین ؟
    ۳- تو متن گفته شده که” سعی میکنیم از فیلترهای کوچک نسبت به بزرگ استفاده کنیم مگر در بعضی موارد خاص اونم در لایه اول ” دلیل استفاده از فیلترهای بزرگ فقط کوچک کردن سایز تصور ورودیه ؟
    ۴-تو معماری VGGNET ابتدا تعداد لایه های هر لایه کانالوشن(K) کمن ولی در ادامه در لایه های بعدی این تعداد افزایش پیدا میکنه ولی در لایه های اتصال کامل این روند تا حدودی برعکس یعنی اول لایه زیاده ود نهایت کم میشه علت این روند چیه ؟
    ۵- آیا ممکنه یه راه کار یا متد منطقی برای یافتن تعداد لایه های کانلاشون در هر شبکه و تعداد لایه های هر لایه کانالوشن بیان کرد ؟ تعداد این لایه ها به چی بستگی داره؟
    ۶-تو متن گفته شده “ک نورون که در لایه کانولوشن دوم قرار دارد یک دید ۳×۳ از لایه کانولوشن اول و به همین صورت یک دید ۵×۵ از توده ورودی دارد.به همین شکل یک نورون در لایه کانولوشن سوم یک دید ۳×۳ از لایه کانولوشن دوم دارد و از این جهت یک دید ۷×۷ هم از توده ورودی دارد”
    آیا میشه نتیجه گرفت تعداد لایه کانولوشن استفاده شده در هر شبکه کانالوشن بسته به فیلتر استفاده شده و سایز تصویر ورودی داره یعنی اونقدر لایه کانولوشن استفاده میکنیم تا نورون لایه کانولوشن اخر دید کاملی از تصاویر ورودی داشته باشه ؟
    ببخشید پر حرفی کردم و زیاد سوال پرسیدم
    از لطفتون سپاس گذارم

    1. ۱٫بله تحت یه لایه مجزا پیاده سازی میشه و اسمش Local contrast normalization هست. که همونطور که در متن گفتم کارش افزایش کنتراست در ورودیه. عملا استفاده دیگه نمیشه. بجاش از بچ نورمالیزیشن استفاده کنید که تاثیرش خیلی واضح هست.
      ۲٫دوتا لایه اول nonlinearity هستن مثل سیگموید مثل relu مثل tanh و… هر دوتا هم پارسال اگه اشتباه نکره باشم معرفی شد. prelu برای رفع مشکل relu (dead relu ها) توسط تیم توسعه و تحقیقات مایکروسافت ارائه شد همراه یه الگوریتم مقداردهی اولیه که ما بهش میگیم msra.
      ELU هم به همین شکل ولی من شخصا فایده خاصی ازش ندیدم . یعنی بهبود خاصی ندیدم . prelu یه چیزایی داشت ولی اینو نه . خودتون باید تست کنید رو معماری و یا دیتاستتون ببینید براتون اکی هست یا نه . مثلا ELU تو سیفار۱۰۰ دقت خیلی خوبی گرفته بود اگر درست یادم باشه اما سیفار ۱۰ به اون اندازه خوب نبود.
      ۳٫بله
      ۴٫دلیل اصلیش کاهش سربار محاسباتی جلوگیری از اورفیتینگ و نهایتا خلاصه سازی فیچرهایی که تا بحال یادگرفتیمه .
      ۵٫مقاله ما که آقا محسن تو گروه گذاشتن رو بخونید خوبه . شاید یکسری ایده بگیرید . در کل قانون خاصی کسی تا بحال عنوان نکرده . اما چیزی که هست اینه که شما هرچه به طرف انتهای شبکه میرید دوست دارید اطلاعات انتزاعی و سطح بالاتری بدست بیارید و این مهمه و بر همین اساس هم تصمیم گیری ها انجام میشه. برای همین هم هرچقدر بالاتر میرید این فیچرمپها افزایش پیدا میکنه تا اطلاعات بیشتری بتونید بدست بیارید . (در شکل ساده . در سناریوهای پیچیده(معماری منظورمه) داستان فرق میکنه ) شما برای استارت کارتون همین قانون اولیه رو لحاظ کنید نتایج خوبی میگیرید
      ۶٫تعداد لایه تابعی از تعداد فیلتر نیست. ربطی هم به سایز تصویر ورودی نداره. نمیتونید فقط بر این اساس عمل کنید. این یه observation از معماری هایی مثل vggnet و الکس نت بوده . قانون نیست که شما بگید مثلا خب الان من مثلا n تا لایه دارم و در نتیجه لایه اخر دید کاملی از ورودی داره پس کافیه و دیگه ادامه ندم . نه اینطوری فکر نکنید.

      خواهش میکنم .

  11. سلام
    ببخشید پررویی میکنم یه سوال دیگه دارم با یه پیشنهاد و یه خواهش ممنون میشم باز هم راهنماییم کنید
    اول سوالم :
    ۱-معماری بشدت همگن (homogeneous ) که تنها دارای فیلتر با اندازه ۳×۳ در لایه کانولوشن و فیلتر ۲×۲ در لایه pooling از ابتدا تا به انتها بود. بعدا مشخص شد که برخلاف قدرت کمتر دسته بندی نسبت به GoogLeNet , VGGNet در وظایف یادگیری انتقال چندگانه (Multiple transfer learning tasks) از GoogLeNet بهتر عمل میکند. بنابر این شبکه VGG در حال حاضر محبوبترین انتخاب برای Feature extraction از تصاویر است
    ۱ تو متن گفته شده” معماری VGGNet به شدت همگن است که در وظایف یادگیری انتقال چندگانه از GoogLeNet بهتر عمل میکنه” مفهوم معماری همگن و وظایف انتقال یادگیری چیه ؟
    پیشنهادم اینه کاش سایر معماری هایی که معرفی کردید مث VGGNet درمورد لایه هاش و ترتیب قرار گرفتنشون یکیم بیشتر توضیح میدادید
    و در اخر خواهشمم اینه در صورت امکان و داشتن وقت پستی که مربوط به عملیات Backpropagation رو در اولویت قرار بدید

    از زحماتتون واقعا ممنونم و بهترینها رو براتون آرزو دارم
    با تشکر

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

  12. سلام
    روزتان بخیر بابت راهنمایی های همیشگیتان
    سوال اول:با مطالعاتی که انجام دادم متوجه شدم شبکه های کانوشن (شبکه های عصبی کانولوشن)برای استخراج ویژگی های شکل و لبه بیشتر کاربرد دارد.مثلا اگر دو شی داشته باشیم از جهات شکل و لبه دقیقا مشابه باشد ولی از لحاظ طیف (رنگ) متفاوت باشد توانایی classification ویا segmentation بین این دو شی را ندارد؟آیا این جمله درست است؟
    در مجموع این شبکه ها چه ویژگی هایی از یک شی را در اولویت استخراج قرار می دهند؟ تنها لبه ها و شکل ها؟ قادر به استخراج ویژگی های طیف و هندسه وغیره نیستند؟
    سوال دوم: این شبکه ها بیشترین قابلیتشان در تصاویر با قدرت تفکیک(رزولیشن) بالا مثلا یک متر میباشد؟ برای تصاویر با رزولیشن مثلا ۱۰ متر نیز قابلیت دارند؟
    آیا امکان دارد مقاله ای بمن معرفی کنید که قبل از ورود به شبکه های عصبی کانولوشن استخراج ویژگی کرده و به عنوان ورودی به cnn داده سپس توسطcnn مجدد استخراج ویژگی کردند؟
    باتشکر .انشاله همیشه به موفقیتهای بیشتر از این دست یابید.

    1. سلام
      نه این حرف صحیحی نیست . شبکه های کانولوشن محدود به شکل و لبه ها نیستند و همه سطوح انتزاعات رو در بر میگیرن
      برای تست این قضیه براحتی میتونید خودتون تست کنید و نتیجه رو ببینید.
      علاوه بر اون فعالیت در حوزه های مختلفی مثل پردازش متن و همینطور semantic segmentation و… دلیل دیگه ای بر این مدعاست.
      در مورد سوال دو هم برای شبکه اندازه ورودی مهم نیست. هرچقدر بیشتر بهتر. برای استفاده و دیدن نتایج خوب هم باید معماری و سخت افزار مورد نیاز تهیه بشه.
      من شخصا الان حضور ذهن ندارم. ولی مقالات اولیه خصوصا طی سالهای ۲۰۱۳ و ۲۰۱۴ رو نگاه کنید باید از این نمونه ها زیاد ببینید. سالهای اولیه مثل ۲۰۱۲ تا نهایتا ۲۰۱۴ اینجور چیزا خیلی بیشتر بود. الان هم نمیگم نیست ولی اون دوره زمانی این چیزا بیشتر مد بود و بیشتر میتونید پیدا کنید.
      در پناه خداوند انشاالله همیشه موفق و سربلند باشید

  13. سلام
    آقای حسن پور من در کامنت قبلی از شما پرسیدم آیا کانولوشن توانایی شناسایی ویژگی های غیر لبه و گوشه و.. رادارد؟ مثلا رنگ.
    شما پاسخ دادید بله. یعنی همانند شبکه های عصبی مصنوعی آنها قادر به تفکیک ویژگی های دیگر هم می باشند.
    اما من امروز درون سایتتون با این شکل مواجه شدم
    http://www.amax.com/blog/wp-content/uploads/2015/12/blog_deeplearning3.jpg
    در واقع شما میگویید با لبه ها و گوشه ها که در لایه های مختلف ایجاد میشود که درواقع باز ترکیبی از همان لبه و.. هست شبکه هایCNN کار میکنند. درمورد پردازش متن که درکامنت بالا گفتیدمتن نیز متشکل از خطوط هست نه رنگ.درصورتی حرف شما درست است که من یک متن مشابه با دو رنگ مختلف داشته باشم.اگر قادر به تفکیک این دو باشد حق با شماست.
    به متن زیر که در سایتان قرار دادید توجه کنید .خودتان نیز اینجا اشاره به ترکیب لبه و… کردید که ترکیب آنها در لایه های بعدی ویژگی های پیچیده را تشکیل میدهد.که این ویژگی های پیچیده باز متشکل از همین لبه هاست.”
    ببخشید من کاملا گیج شدم.و چون در رشته ما در این زمینه کار نشده میخوام مطمین شم که اگه پیاده سازیش میکنم حتما جواب میده.ببخشید وقتتونم میگیرم.شاید سوالاتم برای شما که کامپیوتر خوندید خیلی مبتدی باشه

    “”یادگیری عمیق یا همون Deep learning

    در یادگیری ویژگی سلسله مراتبی ما ویژگی های غیرخطی چندین لایه رو استخراج میکنیم و بعد اونها رو به یک کلاسیفایر (دسته بندی کننده) پاس میدیم که اونم هم تمامی این ویژگی ها رو با هم ترکیب میکنه تا بتونه پیش بینی ای رو انجام بده. هرچقدر این سلسله مراتب لایه ها بیشتر (عمیقتر) باشه در نتیجه ویژگی های غیرخطی بیشتری هم بدست میاد برای همین هم هست که ما علاقه داریم از تعداد لایه های بیشتری در یادگیری عمیق استفاده کنیم (در اصل اون بخش دوم یادگیری عمیق از همین اصل نشات گرفته و اشاره به سلسله مراتب عمیقی داره که تو یادگیری ویژگیها بما کمک میکنه.) از طرف دیگه این ویژگی های پیچیده رو ما نمیتونیم بصورت مستقیم از تصویر ورودی بدست بیاریم. میشه از لحاظ ریاضی نشون داد که بهترین ویژگی هایی که میشه از یه تصویر با استفاده از یک لایه (بدون سلسله مراتب) بدست آورد فقط لبه ها و توده ها (edge ها و blob ها) هستن. دلیلش هم اینه که اینها نهایت اطلاعاتی هست که ما میتونیم از یه تبدیل غیرخطی از تصویر ورودی بدست بیاریم. برای بدست آوردن و یا تولید ویژگی هایی که شامل اطلاعات بیشتری هستند ما نمیتونیم بصورت مستقیم روی تصویر ورودی کار کنیم و لازمه برای اینکار ویژگی های اولیه خودمون رو (مثل لبه ها و توده ها) دوباره تبدیل کنیم تا ویژگی های پیچیده تری که شامل اطلاعات بیشتری برای تمایز بین کلاسها مورد نیاز هست بدست بیاد.

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

    1. سلام
      اون تصویر مربوط به شبکه DBN هست که برای مثال و دادن ایده از اینکه با چی طرف هستید استفاده شده.
      ملاک توانایی شبکه کانولوشن چیزایی که در تصویر اومده نیست. یادتون باشه اون یه متن خیلی ساده و اولیه برای “آشنایی” افراد مختلف هست که هیچ زمینه ای ندارن .
      در مورد پردازش متن اصلا بحث رنگ و… نیست. بحث سر درک خود متن هست. من بفهمم فلان جمله در مورد چه چیزیه یا یکسری مقاله مشابه هم برای بر اساس محتوا یا حوزه کاری مشخص بشه برای من و بینهایت مثال دیگه. رنگ یه ویژگی هست مثل بقیه ویژگی ها. اگر در چیزی عنصر تعیین کننده باشه حتما لحاظ میشه.
      در مورد اون متنی هم که من گفتم باز اون توضیحی خیلی ساده از اتفاقاتی هست که می افته. در ساده ترین شکل ممکن سعی کردم توضیح بدم منظور از ویژگی های سلسله مراتبی چیه . چیزی که برای شمای خواننده قابل درک و ملموس باشه. چطور ما از ویژگی های سطح پایین به ویژگی هایی سطح بالا میرسیم . اینجا ما صورت رو ساده کردیم و فقط در مورد شکل و تصویر که خیلی ملموسه برای ما صحبت کردیم . شما درک خوبی از چهره آدم دارید. میدونید یکی رو بخوایید تشخیص بدید کل صورتش رو نگاه میکنید. (انتزاع سطح بالا) . حالا همین صورت خودش از بخشهای مختلف تشکیل شده چشم ابرو لب بینی و… اینا سطح دیگه ای از انتزاع هستن. و باز شما میدونید که مثلا یک چشم خودش از یکسری خط و خطوط تشکیل شده . این ایده بشما میده که یک شبکه چطور به سطح خوبی از انتزاع درمورد داده ورودی خودش میرسه . این تصویر بود. ورودی میتونه یه متن باشه . ورودی میتونه ویدیو باشه و… در اصل کار تغییری ایجاد نمیشه. کماکان این سلسله مراتب هست که طی میشه.
      اول شبکه یکسری ویژگی های سطح پایین بدست میاره (در تصاویر یه چیزه در متون یه چیز دیگه اس و به همین شکل در هر نوعی متفاوت هست) بعد در ادامه با ترکیب این ویژگی ها با هم به ویژگی های سطح بالا میرسه.
      شما اگر آموزش شبکه های کانولوشن رو ببینید متوجه فیلترهای رنگی ای که در مرحله اول بدست میان هم میشید. متوجه میشید که اگر رنگ هم در تصاویر شما وجود داشته باشه در صورت موثر بودن لحاظ میشه.
      برای همین نگران نباشید .
      قبلا هم عرض کردم شما میتونید تحقیق بکنید از کاربردهای بسیار زیاد این شبکه . بخش پیشینه تحقیق هست که ببینید خوبه برای شروع . و حتما آموزش شبکه های کانولوشن رو ببینید. و سعی کنید خودتون تست کنید تا بصورت عملی این قضیه رو ببینید. اموزش های لازم همه در سایت هست برای اینکار.
      یه نکته دیگه که اضافه کنم اینه تشخیص انواع مختلف ورودی ها (جنس تکسچر نوع و…) توسط شبکه کانلوشن خیلی خیلی بهتر از انسانهاس. یعنی اگه بشما چندتا گربه نشون بدن از نژادهای مختلف به احتمال خیلی زیاد قادر به تشخیص نیستید اما شبکه کانولوشن براحتی از پس این کار بر میاد. رقابت ایمیج نت و حتی CIFAR۱۰ هم نمونه های خیلی خوبی هستن که میتونید برید و ببینید و تست کنید.

      1. من خیلی پوزش میخوام یکی بدلیل سوالات زیادم و دوم اینکه وقتتون رو میگیرم.
        استاد من خیلی حساس هستند و سری قبل بمن گفتند این شبکه ها قابلیت بیشترشان در شناسایی شکل یک شی هست. با اینکه من توحوزه های مختلف در این زمینه مقاله های مختلف خوندم باز نگران هستم و دلیل این همه سوالات تکراریم این هست.شما به بزرگی خوتان منو ببخشید
        وشاید دلیل دیگر آن این هست که من بخش آخر ویژگی هایی را کانولوشن استخراج میکنه و مثلا میشه ۴۰۲۶*۱*۱ درکش برام سخت هست.بخصوص اینکه عدد ۴۰۲۶ مثلا طبق چه رابطه ای بدست آمده.و این افزایش عدد در بعد عمق (بعد سوم) در هر مرحله کانولوشن برچه اساس است.براساس فرمول خاصی این اعداد تغییر می کند.
        ۲۲۷×۲۲۷×۳————۵۵×۵۵×۹۶———۲۷×۲۷×۲۵۶——–۱۳×۱۳×۳۸۴———۱۳×۱۳×۳۸۴—– ۱۳×۱۳×۲۵۶ و غیره

        من خیلی متشکرم.خیلی خیلی خیلی بابت سایت خوبتان و راهنمایی های ارزنده تان و صبوریتان.انشاله پاداش این همه کمکهایی که به انسانهایی که حتی نمیشناسیدشون را در نزدیکترین زمان ازخدا بگیرید.ممنونم

        1. سلام .
          خواهش میکنم . هیچ نیازی به پوزش خواستن نیست خواهر من.کاملا درک میکنم. مشکلی نیست.
          ویژگی های آخر برای انسان قابل درک نیست. نیازی هم نیست که باشن.به زبون خیلی ساده میشه گفت این خلاصه ای از همه ویژگی های مهم در داده های ورودی ماست.
          تا قبل از اون لایه ما یکسری ویژگی مختلف با استفاده از لایه های کانولوشن بدست میاریم . حالا سعی میکنیم هرچی یادگرفتیم رو خلاصه کنیم . این بخش میشه سطح بالاترین ویژگی های موجود در داده ما که بر اساس اون تصمیم گیری میشه.
          اون افزایش عدد در بعد عمق که میبینید در اصل نشانگر تعداد فیلتر ماست.یه فرا پارامتره که شما مشخص میکنید. ما میدونیم که هرچقدر در عمق شبکه پیش بریم اطلاعات سطح بالاتری بدست میاد. چه چیزی این اطلاعات رو بدست میده؟‌ همین فیلترها.این فیلترها روی ورودی ها اعمال میشن و یه نگاشت جدیدی از ورودی ایجاد میکنن که ما بهش میگیم فیچرمپ. بعد این فیچرمپ دوباره توسط یه فیلتر دیگه روش عملیات انجام میشه و یه نگاشت تازه از نگاشت قبلی بدست میاد(اینطوری اطلاعات مختلف تو سلسله مراتب مختلف بدست میاد) برای همین ما رفته رفته تعداد این فیلترها رو زیاد میکنیم تا اطلاعات بیشتری هرکدوم بدست بیارن. از همون ابتدای شبکه تعدادش رو بالا در نظر نمیگیریم چون میدونیم اون اوایل اطلاعات سطح پایین هستن و یکسری تعداد محدود فیلتر کفایت میکنه . اگه بیشتر کنیم میدونیم تاثیر خاصی در دقت نمیزاره . به همین شکل ما میدونیم تعداد این فیلترها در لایه های میانی و بالایی تاثیرشون خیلی زیاده . برای همین اینطور عمل میکنیم .
          این هم که میگم میدونیم از تجربه و عمل هست. یعنی خود شما میتونید تو معماری تون, تو شبکه ای که میسازید, دقیقا این قضیه رو تست کنید و نتیجه رو ببینید.

          بخش آخر مقاله https://arxiv.org/pdf/1608.06037v3.pdf رو ببینید تا متوجه سلسه مراتب بشید(خصوصا مثال در مورد سر )
          بخش ویژوالیزیشن تو آموزش شبکه های کانولوشن هم هست که میتونید ببینید همینطور بخش پیشنیه تحقیق که در مورد کارهای ویژوالیزیشن کار شده مثل کار(https://arxiv.org/pdf/1311.2901v3.pdf) ببینید خوبه.
          همینطور ویدیو یوسینسکی رو حتما ببینید ‌:‌http://yosinski.com/deepvis خیلی جالبه (فیلترشکن داشته باشید)

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

    1. سلام .
      در مورد نوآوری تنها راهش خوندن مقالات حوزه کاری خودتون هست. چون این حوزه ها خیلی زیاد و خیلی سریع دارن پیشرفت میکنن کلا قابل قیاس با هیچ دوره ای نیست!
      و چون تخصصی هستن واقعا نمیشه انتظار داشت همه بدونن تو همه حوزه ها چه خبره و چی state of the art هست و چی انجام شده .
      بهترین پیشنهادی که میتونم بدم پرسیدن سوال تو سایت Quora و stackoverflow هست (بخش cross validation ) تا ببینید محققایی که تو این حوزه هستن چه کمکی میتونن بکنن .
      Quora خیلی فعالتره تو دیپ لرنینگ و ادمهای بزرگی مثل یان لیکان جفری هینتون ایان گود فیلو و بنجیو و … و تقریبا همه بزرگان دیپ لرنینگ اونجا هم هستن.
      محققا و مهندسان شرکتهای بزرگی مثل فیس بوک و گوگل و تویتر و… هم هستن و وقتی سوال میپرسید میتونید انتخاب کنید چه افرادی سوال شما رو ببینن بطور خاص! و اگر خواستن راهنمایی کنن شمارو

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

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

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

    1. سلام .
      برای بخش اول اگر کمی واضح تر بفرمایید ممنون میشم . دقیقا کدوم بخش مدنظر شماست؟
      برای سوال اولتون شما تصویر رو به شبکه ارائه میکنید و بسته به تعداد تصاویری که دارید از هر کلاس شبکه میتونه با قدرت بیشتری این تفکیک رو انجام بده.چیزی هم که مهمه دیتای متنوع و زیاده با تعداد کم فکر نمیکنم دقت خوبی بدست بیارید.
      شبکه کانولوشن به پیش پردازش نیازی نداره اما این به این معنا نیست که پیش پردازش مفید نیست و یا تاثیری نمیذاره . اتفاقا برعکس انجام پیش پردازش میتونه تاثیر خیلی مشخصی در خروجی ای که دریافت میکنید بزاره .
      اینکه چه مجموعه عملیاتی برای اینکار خاص لازمه من شخصا اطلاعی ندارم چون کار نکردم با تصاویر ماهواره ای . اما در حالت کلی, mean subtraction ,ZCA معمولا همیشه تاثیر مثبت میزارن و تقریبا برای گرفتن دقت مناسب در تصاویر طبیعی و معمول ازشون استفاده میشه.
      معمولا پیشنهادی که داده میشه و من شخصا خودم انجام میدم اینه اول بدون هیچ پیش پردازش خاصی به غیر از mean subtraction و یا نرمالسازی شبکه رو روی داده مورد نظر آموزش میدم . بعد سعی میکنم تا جایی که ممکنه دقت افزایش پیدا کنه . بعد که به ماکسیمیم دقت رسیدیم حالا پیش پردازشهای مختلف رو میشه روی داده اعمال کرد و نتیجه رو دید. چون معماری شبکه و پارامترها تا حد خیلی زیادی طی مراحل قبل تنظیم شدن در زمان اعمال پیش پردازش ها میشه براحتی تاثیر هر عمل و موثر بودن اون رو دید و چک کرد.
      تو زمینه تصاویر ماهواره ای با شبکه CNN فک کنم کارهای مختلفی انجام شده برای ایده گرفتن معمولا باز کاری که انجام میشه رجوع به مقالات مشابه هست و چک کردن اینکه اونها چه مراحلی رو طی کردن و به چه صورت عملیاتها انجام شده . الان تقریبا همه زمینه ها بصورت تخصصی اینطور پیش میرن. یعنی رجوع به کارهای انجام شده تو حوزه مورد نظر ، تست و استفاده از دستاوردها و یا نتایج اونها و نهایتا تکمیل و بهبود اون روشهاست

      1. سلام
        در خصوص بخشی که متوجه نشدید. چون فردی مبتدی با CNN هستم وقتی از مفاهیم و نحوه عمکرد لایه های مختلف صحبت می شد سخت مفاهیم رو درک میکردم اما با مثال تصویری که در آموزش بخش دوم ارائه کردید درک بهتری از عملکرد داشتم و پیشنهادی که داشتم در خصوص موارد دیگر نیز چنین تصویر سازی صورت گیرد ( مثلا اتفاقی که در لایه های دیگر شبکه رخ میدهد).
        و البته سوال دیگر اینکه برخی شبکه هایی که تا کنون ارائه شده اند State of art هستند و اگر بخواهم ساختار آنها را منطبق با مساله ای که دارم تغییر دهم. میتوانید سر نخی بدهید تا به هدف مورد نظر راحتتر نزدیک شوم ( قطعا پاسخ مشخصی دارد. اما راهنمایی پخته و سازنده شما تاثیر گذار و قوت قلبی است برای مسیری که در حال طی شدن است).
        امیدوارم در فعالیتهای پژوهشی که خواهم داشت افتخار همکاری با حضرت عالی را در عرصه های علمی داشته باشم.

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

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *