پست وبلاگ

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

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

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

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

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

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

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

توجه:

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

شبکه های کانولوشن :

شبکه های عصبی کانولوشن تا حد بسیار زیادی شبیه شبکه های عصبی مصنوعی هستند که در بخش قبلی در مورد آنها توضیح داده شد. این نوع شبکه ها متشکل از نورونهایی با وزنها و بایاسهای قابل یادگیری (تنظیم) هستند.[۱] هر نورون تعدادی ورودی دریافت کرده و سپس حاصل ضرب وزنها در ورودی ها را محاسبه کرده و در انتها با استفاده از یک یک تابع تبدیل(فعال سازی) غیرخطی نتیجه ای را ارائه دهد. کل شبکه همچنان یک تابع امتیاز (Score function) مشتق پذیر(differentiable) را ارائه میکند, که در یک طرف آن پیکسل های خام تصویر ورودی و در طرف دیگر آن امتیازات مربوط به هر دسته قرار دارد. این نوع شبکه ها هنوز یک تابع هزینه (Loss function) (مثل SVM,Softmax) در لایه آخر (تماما مرتبط یا fully connected) دارند و تمامی نکات مطرحی در مورد شبکه های عصبی معمولی در اینجا هم صادق است.

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

خلاصه معماری

همانطور که ما میدانیم, شبکه های عصبی یک ورودی دریافت میکنند (در قالب یک بردار ) و سپس آنرا از تعدادی لایه مخفی (Hidden layer) عبور میدهند. و نهایتا یک خروجی که نتیجه پردازش لایه های مخفی است در لایه خروجی شبکه ظاهر میشود. هر لایه مخفی از تعدادی نورون تشکیل شده که این نورون ها به تمام نورون های لایه قبل از خود متصل میشوند. نورونهای هر لایه بصورت مستقل عمل کرده و هیچ ارتباطی با یکدیگر ندارند. آخرین لایه تماما متصل (fully connected layer) به لایه خروجی (output layer) معروف است و معمولا نقش نمایش دهنده امتیاز هر دسته(class) را ایفا میکند.

شبکه های عصبی معمولی برای تصاویر معمول(full images) بخوبی مقیاس پذیر نیستند. بعنوان مثال تصاویر موجود در دیتاست CIFAR-10 [2] اندازه ای برابر با 32x32x3 دارند (۳۲ پیکسل عرض, ۳۲ پیکسل ارتفاع و ۳ کانال رنگ ) . بنابر این یک نورون با اتصال کامل (fully connected) در لایه مخفی اول یک شبکه عصبی معمولی 32x32=3072  وزن خواهد داشت . این مقدار شاید در نظر اول مقدار قابل توجهی بنظر نیاید اما بطور واضح مشخص است که این معماری تماما مرتبط قابل استفاده برای تصاویر بزرگتر نخواهد بود. برای مثال یک تصویر با اندازه متعارف تر مثل ۲۰۰ x 200 x 3 باعث میشود که یک نورون 200x200x3=120,000  وزن داشته باشد!. علاوه بر این ما قطعا خواهان تعداد بیشتری از این نورون ها خواهیم بود , پس تعداد پارامترها بسرعت افزایش پیدا میکند . مشخص است این اتصال کامل (Full connectivity) باعث اتلاف (wasteful) بوده و تعداد بسیار زیاد پارامترها هم بسرعت باعث overfitting خواهد شد.

توده های سه بعدی از نورونها!(۳d volumes of neurons):

شبکه های عصبی کانولوشن از این واقعیت که ورودی شامل تصاویر است استفاده کرده و معماری شبکه را به روش معقولی محدود کردند. بطور خاص, برخلاف یک شبکه عصبی معمولی, لایه های یک شبکه عصبی کانولوشن (به اختصار ConvNet) شامل نورونهایی است که در سه بعد عرض, ارتفاع و عمق قرار گرفته اند(مرتب شده اند).(دقت کنید که کلمه عمق در اینجا اشاره به بُعد سوم یک توده فعال سازی (activation volume)[3] دارد و به معنای عمق یک شبکه عصبی کامل که به معنای تعداد لایه های موجود در آن است نمیباشد.). بعنوان یک مثال, تصاویر ورودی از دیتاست CIFAR-10 ,هر کدام یک توده ورودی حاوی مقادیر فعال سازی[۴] an Input volume of activations)) هستند که دارای ابعاد 32x32x3  (عرض, ارتفاع و عمق ) هستند. همانطور که جلوتر خواهیم دید, هر نورون در هر لایه بجای اتصال با تمام نورون ها در لایه قبل تنها به ناحیه کوچکی از لایه قبل از خود متصل است. علاوه بر آن, لایه خروجی نهایی برای تصاویر رقابت CIFAR-10 دارای 1x1x10  بُعد خواهد بود., چرا که همگام با رسیدن به انتهای معماری شبکه ConvNet ما اندازه تصویر را کاهش میدهیم بگونه ای که در انتها تصویر کامل ورودی ما به یک بردار حاوی امتیاز دسته ها (کلاسها) کاهش پیدا میکند و ما با یک بردار که حاوی امتیاز هر دسته است مواجه خواهیم بود. این امتیازات در امتداد بعد عمق(depth dimension) مرتب شده اند. نمایشی از این عمل را در زیر میتوانید مشاهده کنید :

simple neural network

یک شبکه عصبی معمولی با ۳ لایهconvolutional neural networkیک شبکه عصبی کانولوشن

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

یک شبکه ConvNet از چند لایه تشکیل میشود و هر لایه شیوه کار ساده ای دارد. که در آن یک توده سه بعدی ورودی دریافت کرده و آن را با استفاده از توابعی مشتق پذیر (differentiable function) که ممکن است با پارامتر یا بدون پارامتر باشند به یک توده سه بعدی خروجی تبدیل میکند.

[۱] از آنجایی که مقادیر مربوط به این پارامترها ی مراحلی بصورت خودکار تنظیم میشود, ما از ان به یادگیری یاد میکنیم , چرا که شبکه عصبی گام بگام با یادگیری این پارامترها قادر به انجام وظیفه شناسایی محول شده به آن میشود.
[۲] یکی از دیتاست های معروف که جهت رقابتهای جهانی پردازش تصویر مورد استفاده قرار میگیرد. این دیتاست شامل ۶۰ هزار تصویر رنگی با اندازه ۳۲×۳۲ پیکسل در ۱۰ دسته مختلف است. (CIFAR-10 and CIFAR-100 datasets, 2012)
[۳] توده فعال سازی یا Activation volume به یک توده سه بعدی حاوی مقادیر عددی گفته میشود که بعنوان ورودی به تابع فعال سازی ارسال میشوند, برای همین به آنها توده فعال سازی گفته میشود. مقادیر موجود در این توده ها ممکن است مقادیر متناظر به پیکسلهای خام تصاویر باشند (توده فعال سازی ورودی) و یا نتیجه پردازش های انجام شده تا لایه خاصی در شبکه باشند (بعنوان مثال توده فعال سازی در لایه دوم یعنی مقادیر عددی در لایه دوم که نتیجه عملیاتهای لایه های قبل تا لایه فعلی است (ضرب وزنها در خروجی حاصل از لایه قبل و…)
[۴] در اینجا مقادیر فعال سازی چیزی جز مقادیر مربوط به پیکسل های خام تصاویر ورودی نیستند.

لایه های مورد نیاز برای ایجاد یک شبکه ConvNet

همانطور که در بالا اشاره کردیم, هر لایه شبکه کانولوشن یک توده فعال سازی را از طریق یک تابع مشتق پذیر به توده فعال سازی دیگر تبدیل میکند. ما از سه نوع اصلی لایه ها برای ساخت یک معماری شبکه کانولوشن استفاده میکنیم . این لایه ها عبارتند از : لایه کانولوشن, لایه Pooling و لایه تماما متصل (Fully connected layer) که دقیقا همانند همان که در شبکه های عصبی معمولی میبینیم است . ما این لایه ها را روی هم قرار میدهیم تا یک معماری کامل از شبکه کانولوشن ایجاد کنیم .
برای روشن تر شدن بیشتر مباحث بالا یک شبکه کانولوشن ساده برای دسته بندی دیتاست CIFAR-10 ایجاد میکنیم . برای اینکار ما میتوانیم یک معماری با لایه های لایه ورودی , لایه کانولوشن, لایه RELU , لایه POOL , لایه FC  داشته باشیم .
لایه ورودی (Input layer) شامل مقادیر پیکسل های خام تصویر ورودی ما هستند . یعنی در اینجا ما یک تصویر با عرض ۳۲ , ارتفاع ۳۲ و ۳ کانال رنگ قرمز,سبز , آبی خواهیم داشت.
لایه کانولوشن (CONV layer) این لایه خروجی نورونهایی که به نواحی محلی در ورودی متصل هستند را محاسبه میکند. عمل محاسبه هم از طریق ضرب نقطه ای بین وزن های هر نورون و ناحیه ای که آنها به آن(توده فعال سازی ورودی) متصل هستند صورت میگیرد. نتیجه این عمل یک توده با اندازه 32x32x12 میشود.
لایه RELU بر روی تک تک نورون ها یک تابع فعال سازی مثل max(0,x) (که آستانه گذاری را بر روی ۰ انجام میدهد یعنی مقادیر منفی را صفر در نظر میگیرد) را اعمال میکند. این کار تغییری در اندازه توده از مرحله قبل نمیدهد بنابر این نتیجه همچنان یک توده با اندازه 32x32x12  خواهد بود .
لایه Pooling عملیات downsampling را در امتداد ابعاد مکانی (عرض و ارتفاع) انجام میدهد که نتیجه این کار یک توده با اندازه 16x16x12  خواهد بود . همانطور که دقت کردید در لایه pooling ما ابعاد توده ورودی (تصویر) را کاهش میدهیم.و در اصل از طریق عملیات این لایه است که در انتهای شبکه کانولوشن ما به یک بردار امتیاز دست پیدا میکنیم .
لایه FC یا تماما مرتبط وظیفه محاسبه امتیاز دسته ها (class) را دارد. نتیجه کار این لایه یک توده با اندازه 1x1x10  است که هر کدام از این ۱۰ عدد نمایانگر یک امتیاز برای یک دسته بخصوص (مثل یکی از ۱۰ دسته تصویر موجود در دیتاست CIFAR-10 ) است. مثل شبکه های عصبی معمولی و همانطور که از اسم این لایه بر می آید هر نورون در این شبکه با تمام نورون ها در توده قبل از خود ارتباط دارد.
با این روش, شبکه کانولوشن مقادیر پیکسل های خام تصویر اصلی را لایه به لایه به امتیاز دسته ها در انتهای شبکه تبدیل میکند.. دقت کنید که بعضی از لایه ها پارامتر داشته و بعضی دیگر فاقد پارامتر اند. بطور خاص لایه های Conv/FC لایه هایی هستند که تبدیلاتی را انجام میدهند که نه تنها تابعی از فعال سازی ها(مقادیر موجود) در توده ورودی اند بلکه تابع پارامترهایی نظیر وزن و بایاس نورون ها هم هستند .از طرف دیگر لایه های RELU/POOL تنها یک تابع ثابت را پیاده سازی میکنند. پارامترهای موجود در لایه های Conv/FC توسط روش gradient descent آموزش میبینند تا امتیازات دسته ها (class)یی که شبکه کانولوشن حساب میکند با برچسب های هر تصویر در مجموعه آموزشی سازگار باشد.(همخوانی داشته باشد).

بطور خلاصه :

• یک معماری شبکه کانولوشن لیستی از لایه هاست که توده متشکل از تصویر ورودی را به یک توده خروجی ( مثل توده ای که امتیازات دسته ها را در خود دارد) تبدیل میکند.
• تعداد کمی از انواع لایه ها برای شبکه کانولوشن وجود دارد( بعنوان مثال CONV/FC/RELU/POOL متداول ترین لایه ها در شبکه کانولوشن هستند)
• هر لایه یک ورودی سه بعدی را دریافت کرده و انرا از طریق یک تابع مشتق پذیر به یک توده سه بعدی خروجی تبدیل میکند .
• هر لایه ممکن است دارا یا فاقد پارامتر باشد (بعنوان مثال لایه های CONV/FC دارای پارامتر و لایه های RELU/POOL فاقد پارامتر هستند)
• هر لایه ممکن است دارا یا فاقد فرا پارامتر(hyperparameter) اضافی باشد. (مثلا لایه های CONV/FC/POOL دارای این نوع پارامترها هستند در حالی که لایه RELU فاقد این نوع پارامتر است)

نمونه ای از توده های فعال سازی در یک نمونه از معماری شبکه کانولوشن

نمونه ای فعال سازیهای در یک نمونه از معماری شبکه کانولوشن .

توده ابتدایی پیکسل های خام تصویر را در خود ذخیره میکند(تصویر اتومبیل در سمت چپ) و آخرین توده امتیاز دسته ها را در خود جای میدهد(لایه تماما متصل یا به اختصار FC). هر توده فعال سازی در طی مسیر پردازش در قالب یک ستون نمایش داده شده است. از آنجایی که نمایش توده های ۳بعدی مشکل است ما برشهای (قاچهای) هر توده را بصورت سطری مرتب کردیم. توده مربوط به آخرین لایه حاوی امتیازات مربوط به هر دسته (class) است. اما در اینجا ما تنها ۵ امتیاز بالاتر را نمایش دادیم . معماری نمایش داده شده در اینجا یک شبکه VGGNet کوچک است که جلوتر در مورد آن توضیح داده ایم .

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

اتمام بخش اول

سید حسین حسن پور

بهار ۹۵

بعدی: آموزش شبکه کانولوشن بخش دوم

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

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

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

مقالات مرتبط

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

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

    1. سلام.
      خواهش ميكنم خدا رو شكر مفيد واقع شد.
      تو بخش منابع يادگيري اگه دقت كنيد چند نمونه پياده سازي لينكش قرار داده شه (با جاوا اسكريپت با پايتون و با سي++) كه ميتونيد نگاه كنيد.
      سورس كد فريم وركهايي مثل Caffe‌ هم هست كه ميتونيد نگاه بهشون بندازيد . براي دانلود بخش ابزارها رو ببينيد لطفا.
      شبكه كانولوشن عميق همين شبكه كانوشن هست هيچ فرقي با اين نداره جز اينكه كه تعداد لايه هاش بيشتره.(مثلا LeNet فككنم دو لايه داشت . كه يه شبكه كانولوشن ساده (كم عمق) بود. بعد از اون هرجا اسم شبكه كانولوشن رو ديديد منظور ورژن عميق اون هست (مثل الكس نت با فك كنم ۸ لايه يا vggnet با ۱۶ تا ۱۹ لايه يا گوگل نت با ۲۲ لايه و يا اخيرا ResNet با ۱۵۲ لايه) امروزه هرجا اسمي از شبكه كانولوشن ميشنويد منظور شبكه عصبي كانولوشن عميق هست كه چون همه ميدونن ديگه كمتر اون بخش عميق رو ذكر ميكنن.

  2. سلام.
    مطالب سایتتون برای من تا این مرحله بسیار مفید بوده است . خوشحالم که هنوز افرادی هستند که
    بدون هیچ توقعی برای مردمشون خدمت می کنند.
    واقعا ممنونم.
    یک سوال داشتم: من یه سری تصویر دارم که میخوام از طریق cnn کلاس بندی انجام دهم.
    داده های من دو کلاسه هستند و سطح روشنایی خاکستری دارند(رنگی نیست). و همچنین ابعاد داده من ۵۰ در ۵۰ هستش. از چه کد آماده ای برای انکار میتونم
    استفاده کنم؟؟
    خوشحال میشم راهنماییم کنید.
    m.norizadeh1369@gmail.com

    1. سلام .
      خب خدا رو شکر . پس برای ما یه دعا کنید آخر عاقبت بخیر بشیم و خدا هم قبول کنه 🙂
      شما میتونی براحتی از هر فریم ورکی استفاده کنی . چه Caffe چه Torch و چه نمونه های دیگه .
      تو Caffe هم نمونه Classification داریم هم به سی++ هم پایتون و هم متلب یعنی با هر کدوم اینا میتونید با تغییرا جزئی کارتون رو انجام بدید. آموزش شبکه هم براحتی با خود Caffe قابل انجامه .
      آموزش های اولیه رو دادم تو همین سایت . یه نگاه بندازید خوبه .
      باز اگه سوالی بود میتونید تو همین کامنت یا بهتر تو گروه یادگیری عمیق که لینکش تو سایت دادم بپرسید و انشاالله بلد بودیم کمکتون کنیم .
      در پناه حق انشالله همیشه موفق و سربلند باشید
      التماس دعا

  3. سلام.
    ممنون بابت پاسختون.
    من برای کلاس بندی دو تا داده دارم که مربوط به تصویر هواپیما و صندلی است. از هر کلاس ۲۰ تصویر برای آموزش استفاده می کنم که مجموعا ۴۰ تصویر برای آموزش و ۴۰ تصویر برای تست استفاده کردم. متاسفانه خوب کار نمیکنه!!! همه کلاسارو ۲ تشخیص میده!!!
    جزئیات کار: تصویر ۹۶*۹۶
    دو لایه کانولوشن و دو لایه pooling
    اندازه کرنل ۵*۵
    stride=1 در نظر گرفته در این کد. و پدینگ هم نداره.
    برای داده minst که باهمین مشخصات ولی سایز تصویر ۲۸*۲۸ هست خوب کار میکنه.
    از این تولباکس استفاده کرده ام: rasmusbergpalm-DeepLearnToolbox-5df2801
    لطفا راهنماییم کنید که باید چیکار کنم؟؟

    1. سلام.
      تعداد تصاویر شما خیلی کمه . MNIST رو که میبینید خوب جواب میده ۶۰ هزارتا عکس داره . ۵۰ هزارتاش فقط برای اموزش هست و ۱۰ هزارتاش برای تست.
      بعد الزاما یک پیکربندی و معماری که برای یه دیتاست خوب کار میکنه برای دیتاست دیگه خوب کار نمیکنه و باید خوب تستش کنید و حتما زمان تست سعی کنید نمودار Loss/accuracy رو رسم کنید و بصورت عینی ببینید اموزش چطور داره پیش میره .
      شما قبل از اینکه پیکربندی رو دست بزنی اول باید تعداد تصاویرت رو زیاد کنی .
      برای این کار دو کار میتونی انجام بدی .
      ۱٫ اول یه دیتاست از تصاویر که مثل تصاویر شماست گیر بیار و شروع کن رو اون دیتاست اموزش دادن شبکه ات و بعد که به دقت خوبی رسیدی مدل رو سیو میکنی و میای روی تصویر خودت شروع میکنی به تنظیم دقیق (به این کار میگن transfer learning و اموزش انجامش تو Caffe تو سایت هست)
      معمولا هم وقتی تعداد تصاویر کم باشه از این روش استفاده میکنن. یا اگه مدل از پیش اموزش داده شده روی تصاویر شبیه تصاویر شما وجود داره از اون هم استفاده میکنن .
      ۲٫ شما بصورت مصنوعی (اگه نمیتونی داده بیشتری جمع کنی ) بر اساس تصاویری که داری تصاویر جدید ایجاد کنی . یعنی با rotate کردن crop کردن اضافه کردن نویز و… تغییراتی که تاثیر سوئی درنتیجه شما نمیزاره ولی اندازه دیتاستت رو میتونه افزایش بده سعی کنی دیتاستت رو بزرگتر کنی
      ضمنا سوالتون رو تو گروه بپرسید بهتره چون علاوه بر من افراد دیگه هم ممکنه کمکهای بهتری بشما بکنن. و مهمتر از اون اگر کسی مشکل شما رو داشته باشه میتونه استفاده کنه.

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

  5. سلام
    و با عرض تشكر از شما به خاطر مطالب مفيدتون .
    متاسفانه من اين قسمت رو متوجه نمي شم ممنون مي شم اگه امكانش هست يكم بيشتر توضيح بديد
    “”شامل نورونهایی است که در سه بعد عرض, ارتفاع و عمق قرار گرفته اند(مرتب شده اند).(دقت کنید که کلمه عمق در اینجا اشاره به بُعد سوم یک توده فعال سازی (activation volume)[3] دارد و به معنای عمق یک شبکه عصبی کامل که به معنای تعداد لایه های موجود در آن است نمیباشد.””
    يكم بيشتر شكل شبكه عصبي كانولوشن رو توضيح بديد ممنون مي شم

    1. سلام .
      تو شبکه کانولوشن ما با توده های سه بعدی سرو کار داریم . در شبکه های عصبی معمولی (mlp) ما تو هر لایه فقط یکسری نورون داشتیم . مثلا میگفتیم لایه اول ۱۰ تا نورون داره یا ۵ تا نورن داره . لایه دوم مثلا ۲۰ تا نورون داره و الی اخر . و این نورون ها هم همه بهم متصل بودن
      یعنی مثلا نورون شماره ۱ به همه نورونها از مرحله قبل وصل بود .
      در شبکه کانولوشن (لایه کانولوشن) اینطور نیست یکم ماجرا فرق میکنه. اینجا ما نورونهایی در سه بعد داریم . یعنی یه اندازه مکانی داریم که اشاره به ابعاد توده داره مثلا ۳*۳ و یک عمق داریم که اشاره به عمق این توده داره مثلا ۱۲ که میشه ۳x3x12 . اون ۱۲ یا عمق در اصل تعداد فیچرمپهای خروجی لایه کانولوشن هست (به عبارت دیگه میشه گفت تعداد نورون هایی که در آن واحد به یک ناحیه خاص از ورودی نگاه میکنن هست)
      بعد این نورون ها هم با یک مکانیزم محلی روی ورودی اعمال میشن و خروجیشون هم تشکیل یک توده سه بعدی دیگه رو میده .
      ادامه آموزش رو بخونید همه اینها مشخص میشه. خصوصا وقتی به بخش دوم برسید یک مثال عملی هم هست که میتونید ببینید عینا چه اتفاقی داره میوفته تقریبا.

  6. سلام
    وقتتون بخیر
    در این قسمت از متن بالایی که لطف کردین گذاشتین نوشتین که:
    “علاوه بر این ما قطعا خواهان تعداد بیشتری از این نورون ها خواهیم بود , پس تعداد پارامترها بسرعت افزایش پیدا میکند . مشخص است این اتصال کامل (Full connectivity) باعث اتلاف (wasteful) بوده و تعداد بسیار زیاد پارامترها هم بسرعت باعث overfitting خواهد شد.”
    من احساس میکنم یه تناقضی وجود داره، ما میخواهیم تعداد نورون ها زیاد باشه ولی از طرفی هم تعداد زیاد نورون ها منجر به افزایش تعداد پارامتر ها و اورفیتینگ میشه…پس چرا میخوایم تعداد نورون ها زیاد باشه؟؟ لطفا توضیح میدین…شاید اشتباه متوجه شدم

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

      در شبکه های کانولوشن با ایجاد اشتراک پارامتر تا حد خیلی زیادی این مساله برطرف شده . البته دقت کنید که لایه هایی مثل fully connected یا locally connected نمونه هایی هستن که در اونها هر نورون دارای وزن برای خودش هست . فرق بین fully connected‌با locally connected‌ هم در این هست که دومی بر خلاف اولی لوکالیتی تصویر رو در نظر میگیره .

  7. ببخشید یه سوال دیگه هم دارم
    منظورتون از این جمله شبکه های عصبی مصنوعین یا کانولوشنی؟
    “نورونهای هر لایه بصورت مستقل عمل کرده و هیچ ارتباطی با یکدیگر ندارند.” ‏

  8. سلام ممنون از مطلب عالی شما یه سوال داشتم:
    چرا خروجی لایه کانولوشن عمقش ۱۲ می شود؟
    لایه کانولوشن (CONV layer) این لایه خروجی نورونهایی که به نواحی محلی در ورودی متصل هستند را محاسبه میکند. عمل محاسبه هم از طریق ضرب نقطه ای بین وزن های هر نورون و ناحیه ای که آنها به آن(توده فعال سازی ورودی) متصل هستند صورت میگیرد. نتیجه این عمل یک توده با اندازه ۳۲x32x12 میشود.

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

  9. سلام آقای حسن پور،

    من یه سوالی داشتم راجع به استفاده از شبکه های کانولوشن برای تخمین توابع (function approximation or function fitting) . آیا برای تخمین توابع می شه از این نوع شبکه ها استفاده کرد. به عنوان مثال من یه تابع دارم که معادله اش نا مشخص هست و می خوایم توی یه بازه خیلی وسیع اونو شناسایی کنیم و تنها به یه سری داده رندم از اون تابع دسترسی داریم. آیا امکان استفاده از شبکه های کانولوشن برای این کار هست. یا استفاده از این شبکه ها فقط و فقط محدود به پردازش تصویر و خوشه بندی میشه؟
    سوال دوم اینکه معادل nftool در نرم افزار متلب آیا جعبه ابزاری برای تخمین توابع توسط شبکه های کانولوشن وجود داره؟

    ممنون میشم اگه راهنمایی بفرمایید

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

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

  10. با سلام و خسته نباشید و آرزوی سال پر از توفیق برای شما
    یه سوال داشتم، من یه دیتا بیس دارم که درباره activity Health میباشه، به این صورت که یه سری فعالیت مثل دراز کشیدن، دویدن، نشستن، کامپیوتر کار کردن و… رو داخلش برای آدمهای مختلف قرار دادن. می خواستم بدونم می تونم با شبکه CNN هر کدوم از این فعالیتهای موجود رو کلاسبندی کنم. مثلا با ورود دیتای یه قسمت از دیتابیس سیستم اتوماتیک بگه این مربوط به فعالیت خوابیدن بوده یا پیاده روی بوده. امکان این کار اصلا وجود داره یا نه
    ممنون از راهنماییتون میشم

  11. با سلام مجدد و خسته نباشین و تشکر ویژه بابت اینکه اینقدر خوب پاسخگو هستین خدا بهتون خیر بده
    سوالی که داشتم در باره این بود که وقتی مراحل کانولوشن و pooling انجام میشه و داده ها تبدیل به یه سری اجزای کوچک می شن به یه شبکه فول کانکت متصل میشن که پیرو فرمایشات جنابعالی این فول کانکتت یه شبکه عصبی مثل mlp میباشه. حالا مشکل بنده اینجاست که نمی دونم چطوری شبکه تست میشه. برای مثال اگه یه سری تصویر ۳۲*۳۲ به شبکه اعمال کنیم کانلولوشن و پولینگ انجام بشه و اجزا به ۱۲۰ نرون کوچک تبدیل بشن و سپس آموزش ببینه، چطوری تصویر جدید ۳۲*۳۲ رو باید به شبکه اعمال کنیم تا طبقه بندی رو برای ما انجام بده؟ آیا بایستی که تصویر رو به اندازه تعداد نرونهای شبکه فول کانکتت در بیاریم و به net شبکه آموزش داده شده اعمال کنیم یا نه؟
    خیلییی ممنون میشم درباره این موضوع راهنماییم کنید
    بازم تشکر

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

  12. سلام . ممنون از مطالبتون
    من میخواهم از مطالب شما در پایان نامه ام استفتده کنم . لطف میکنید به من بگید رفرنسی خودتون که برای پایان نامه یا مقاله شما باید بذارم رو ؟

    1. سلام
      مطالب من به دو صورت هست. اگه از مطالب سایت استفاده کردید میتونید همین سایت رو ارجاع بدید اگر نه عنوان پایان نامه من (که مطالب سایت از اون گرفته شده) این بود : دسته بندی اشیاء با استفاده از شبکه عصبی کانولوشن عمیق (اگر پایان نامه رو نیاز دارید که بخونید میتونید ایمیل بزنید تا من یه نسخه ای که دستم مربوط به مراحل اخر نگارش رو براتون ارسال کنم )
      اگر از شبکه SimpleNet استفاده کردید یا میخوایید بکنید یا بحثهایی که در مقاله (ماحصل پایان نامه) شده رو میخوایید رفرنس بدید میتونید این مقاله رو رفرنس بدید فعلا (https://arxiv.org/abs/1608.06037 )
      اطلاعات در مورد ساختار شبکه و… در داخل پایان نامه زیاد بحث نشد و عوضش در مقاله من اون رو اوردم برای همین این گزینه ها پیش روی شماست

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

        من ایمیل شمارو ندارم اگر لطف کنید به ایمیل من پایان نامه رو بفرسید ممنون میشم

        تشکر و سپاس

        zahra.torabi.1367@gmail.com

          1. سلام
            ببخشید من از شبکه کانولوشن برای پیش بینی نوسان قیمت میخوام استفاده کنم. سوالم این هست که شما از تولباکس متلب برای کد نویسی استفاده کرده اید یاخودتون کد نوشته اید ؟ و اینکه مدل های مثل ALEXNET فقط در زمینه تصویر هستند و در زمینه پیش بینی با شبکه کانولوشن از این مدل ها هم میشه استفاده کرد ؟ یا اینکه براساس چیدمان ورودی ها و با دو لایه که لایه اول ۶ تا ساب سمپل داره و لایه دوم ۱۲ به یک پیش بینی با دقت خوبی برسم راه صحیحی است ؟

  13. با عرض سلام وادب واحترام خدمت شما.
    از مطالب بسیار مفیدی که بر روی سایت قرار دادید بسیار سپاسگزارم.
    من در مورد این مبحث خیلی مبتدی هستم. سوالاتی که دارم شاید با اندک دانش من اشتباه باشه عذر میخوام.
    ۱ منظور از فیلتر همون نورون ها هستند؟
    ۲ اندازه فیلتر ها با لایه کانولوشن و وسعت ناحیه ادراکی چه ارتباطی دارند؟
    ۳ من مفهوم این جمله را متوجه نمیشم؟
    With smaller kernels we can stack more convolutional layers, while having the same receptive field of
    bigger kernels

    1. سلام
      ۱٫نه فیلتر همون ماتریس وزن ما هست
      ۲٫اندازه فیلتر تاثیر مستقیم روی جمع آوری اطلاعات ویا هدردهی اون و همینطور اندازه توده خروجی داره . اندازه فیلتر مساوی receptive field هست در سطح یک لایه. اما وقتی چند لایه باشه بطور غیرمستقیم لایه های بعدی وسعت بیشتری از ووردی رو در بر خواهند گرفت. بخش دوم آموزش شبکه کانولوشن رو بخونید به همه این سوالاتتون پاسخ داده میشه اگر با خوندن اون بخش باز هم متوجه نشدید بپرسید تا توضیح بیشتری بدم.
      ۳٫معنای اون جمله اینه که با قرار دادن چند لایه کانولوشن با اندازه کرنل(فیلتر ) کوچکتر ، میشه به همون اندازه receptive field یک کرنل بزرگتر رسید (با این تفاوت که در این حالت (کرنل کوچک+تعداد بیشتر لایه کانلووشن) ما غیرخطی بیشتری لحاظ کردیم و به مراتب دقت بهتری میگیریم.)
      این هم در همون بخش دو باید بتونید بخونید اگر متوجه نشدید بفرمایید (چون این سوال مرتبط با سوال قبلی شما در مورد مفهوم receptive field هست. )

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

پاسخ دهید

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