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

در این آموزش، اصول اولیه شبکه های عصبی Convolutional (CNNs) و نحوه استفاده از آنها برای یک کارکرد طبقه بندی تصویر را یاد خواهید گرفت. ما همچنین خواهیم دید که افزایش داده ها در بهبود عملکرد شبکه کمک می کند. ما در مورد آموزش پیشین درباره شبکه های عصبی Feedforward، توابع فعال سازی و مبانی Keras بحث کردیم. ما از مجموعه داده های MNIST و CIFAR10 برای توضیح مفاهیم مختلف استفاده خواهیم کرد.

1. انگیزه

در مقاله قبلی ما در مورد طبقه بندی تصویر، ما از Perceptron Multilayer در مجموعه داده های ارقام MNIST استفاده کردیم. عملکرد بسیار خوب بود، به طوری که ما به دقت 98.3٪ در داده های آزمون دست یافتیم. اما این رویکرد مشکل داشت. در مجموعه داده های آموزشی ما، همه تصاویر در مرکز قرار دارند. اگر تصاویر در مجموعه آزمون خارج از مرکز قرار بگیرند، روش MLP با شکست مواجه می شود. ما می خواهیم شبکه ترجمه Invariant باشد.

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

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

یکی دیگر از مشکلات عمده با یک طبقه بندی کامل متصل شده این است که تعداد پارامترها بسیار سریع افزایش می یابد، زیرا هر گره در لایه L به یک گره در L-1 متصل است. بنابراین شبکه های بسیار عمیق را تنها با استفاده از یک ساختار MLP امکان پذیر نمی سازد.

هر دو مشكل فوق به وسيله استفاده از شبكه عصبي Convolutional كه در بخش بعدي آن را مشاهده مي كنيم، تا حد زيادي حل مي شوند. ما در ابتدا مفاهیم درگیر در یک شبکه عصبی Convolutional را به طور مختصر توضیح خواهیم داد و سپس پیاده سازی CNN را در Keras مشاهده خواهیم کرد تا تجربهی دستوری داشته باشید.

 

2. شبکه عصبی Convolutional

شبکه های عصبی انعقادی یک شکل از شبکه عصبی Feedforward هستند. با توجه به زیر یک طرح از یک CNN معمولی است. بخش اول شامل لایه های Convolutional و Max-pooling است که به عنوان ویژگی استخراج عمل می کنند. بخش دوم شامل لایه کامل متصل شده است که تحولات غیر خطی از ویژگی های استخراج را انجام می دهد و به عنوان طبقه بندی عمل می کند.

در نمودار بالا، ورودی به شبکه های Conv، Pool و Lens انباشته شده تغذیه می شود. خروجی می تواند یک لایه softmax باشد که نشان می دهد آیا یک گربه یا چیزی دیگری وجود دارد. شما همچنین می توانید یک لایه سیگموئید داشته باشید تا احتمال اینکه تصویر یک گربه باشد را به شما نشان دهد. بگذارید دو لایه را در جزئیات ببینیم.

2.1 لایه متخلخل

لنور کانولوشن را می توان به عنوان چشمان CNN در نظر گرفت. نورونهای این لایه به ویژگی های خاصی نگاه می کنند. اگر آنها ویژگی های مورد نظر خود را پیدا کنند، آنها فعال سازی بالا را تولید می کنند.

انقباض را می توان به عنوان یک مجموع وزنی بین دو سیگنال (از لحاظ اصطلاحات پردازش سیگنال) یا توابع (از لحاظ ریاضیات) در نظر گرفت. در پردازش تصویر، برای محاسبه کانولوشن در یک مکان خاص (x، y)، قطعه اندازه k × k را از تصویر مرکزی در محل (x، y) استخراج می کنیم. سپس مقادیر را در این عنصر توسط عنصر chunk با فیلتر تبدیل (همچنین kx k اندازه) ضرب می کنیم و سپس همه آنها را برای بدست آوردن یک خروجی واحد اضافه می کنیم. خودشه! توجه داشته باشید که k به عنوان اندازه کرنل نامیده می شود.

یک مثال از عملیات کانولاسیون در ماتریس اندازه 5 × 5 با یک هسته اندازه 3 × 3 در زیر نشان داده شده است:

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

بیایید به مثال خاصی نگاه کنیم و شرایط را درک کنیم. فرض کنید تصویر ورودی 32x32x3 است. این چیزی جز آرایه ای از عمق 3 نیست. هر فیلتر کوانتومی که ما در این لایه تعریف می کنیم باید عمق یکسان با عمق ورودی باشد. بنابراین ما می توانیم فیلترهای کانولای عمق 3 را انتخاب کنیم (به عنوان مثال 3x3x3 یا 5x5x3 یا 7x7x3 و غیره). بیایید فیلترینگ کانورتور 3x3x3 را انتخاب کنیم. بنابراین، با اشاره به مثال فوق، در اینجا هسته کانولوشن به جای مربع یک مکعب خواهد بود.

اگر ما می توانیم با استفاده از کشیدن فیلتر 3x3x3 بر روی کل تصویر اندازه 32x32x3، عملیات کانولو را انجام دهیم، یک تصویر خروجی از اندازه 30x30x1 به دست می آوریم. این به این دلیل است که عملیات convolution برای یک نوار 2 پیکسل در اطراف تصویر تعریف نشده است. ما باید اطمینان حاصل کنیم که فیلتر همیشه در داخل تصویر است. بنابراین 1 پیکسل از سمت چپ، راست، بالا و پایین تصویر دور می شود.

برای پیدا کردن ویژگی های مربوطه فیلترهای مشابه بر روی کل تصویر اسلاید شده اند. این باعث می شود CNNs ترجمه غریزی.

2.1.1 نقشه های فعال سازی

برای یک تصویر ورودی 32x32x3 و اندازه فیلتر 3x3x3، ما 30x30x1 مکان دارد و نورون مربوط به هر مکان وجود دارد. سپس خروجی های 30x30x1 یا فعال سازی همه نورون ها نقشه های فعال سازی نامیده می شود. نقشه فعال سازی یک لایه به عنوان ورودی به لایه بعدی عمل می کند.

2.1.2 توزیع وزن و تعصب

در مثال ما 30 × 30 = 900 نورون وجود دارد زیرا مکان های بسیاری وجود دارد که در آن 3x3x3 فیلتر قابل استفاده است. برخلاف شبکه های عصبی سنتی که وزن و تعصب نورون ها مستقل از یکدیگر هستند، در مورد CNN ها، نورون های مربوط به یک فیلتر در یک لایه، یک وزن و تعصب مشابه دارند.

2.1.3 گام های بلند برداشتن

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

2.1.4 فیلترهای چندگانه

به طور معمول، ما در بیش از یک فیلتر در یک لایه کانوال استفاده می کنیم. اگر ما از 32 فیلتر استفاده کنیم، یک نقشه فعال سازی 30x30x32 اندازه خواهد داشت. لطفا برای یک نمای گرافیکی به شکل زیر مراجعه کنید.
توجه داشته باشید که تمام نورونهای مرتبط با یک فیلتر همان وزن و تعصب را دارند. بنابراین تعداد وزن ها در هنگام استفاده از 32 فیلتر به سادگی 3x3x3x32 = 288 است و تعداد بی توجهی ها 32 است.

نقشه های فعال سازی 32 به دست آمده از استفاده از هسته های محرک در زیر نشان داده شده است.

2.1.5 پوسته پوسته شدن

همانطور که می بینید، پس از هر کانولوشیم، خروجی کاهش می یابد (همانطور که در این مورد ما از 32 × 32 به 30 × 30 می رویم). برای راحتی، یک عمل استاندارد برای نوک پد به مرز لایه ورودی است به طوری که خروجی همان اندازه لایه ورودی است. بنابراین، در این مثال، اگر یک لایه از ابعاد 1 را در هر دو طرف لایه ورودی اضافه کنیم، اندازه لایه خروجی 32x32x32 خواهد بود که باعث سادهتر شدن اجرای آن می شود. بگذارید بگوییم شما دارای یک ورودی از اندازه NxN، یک فیلتر از اندازه F است و شما از stride S استفاده می کنید و یک عدد صفر از اندازه P به تصویر ورودی اضافه می شود. سپس، خروجی از اندازه MxM خواهد بود که در آن

ما می توانیم الزامات مورد نیاز را محاسبه کنیم تا ابعاد ورودی و خروجی با تنظیم در معادله فوق و حل کردن P برای یکسان باشد.

2.2 CNN ها ویژگی های سلسله مراتبی را یاد می گیرند

بیایید بحث کنیم چگونه CNN ها ویژگی های سلسله مراتبی را یاد بگیرند.

 

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

در لایه اول، مربع مشخص شده 1 از ناحیه ای در تصویر که در آن برگ رنگ می شود به دست می آید.
در لایه دوم، مربع مشخص شده 2 از مربع بزرگتر در لایه 1 بدست می آید. اعداد در این مربع از چندین ناحیه از تصویر ورودی به دست می آیند. به طور خاص، کل منطقه اطراف گوش چپ گربه مسئول ارزش در مربع مشخص شده 2 است.
به همین ترتیب، در لایه سوم، این اثر آبشار باعث می شود مربع مشخص شده 3 از یک منطقه بزرگ در اطراف منطقه پا به دست آید.
ما می توانیم از بالا بیان کنیم که لایه های اولیه به نقاط کوچکتر تصویر نگاه می کنند و بنابراین می توانند فقط ویژگی های ساده مانند لبه ها / گوشه ها و غیره را یاد بگیرند. همانطور که در عمق شبکه قرار می گیریم، نورون ها از قسمت های بزرگتر تصویر دریافت می کنند و از نورون های مختلف دیگر. بنابراین، نورونها در لایه های بعد می توانند ویژگی های پیچیده ای مانند چشم ها / پاها را یاد بگیرند و چه چیزی نمی کنند!

2.3 حداکثر لایه جمع آوری

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

توجه: Overfitting شرایطی است که یک مدل آموزش دیده به خوبی بر روی داده های آموزشی کار می کند، اما به خوبی بر روی داده های آزمون کار نمی کند.

شایع ترین شکل جمع آوری حداکثر جمع شدن است که ما یک فیلتر اندازه p را می گیریم و حداکثر عملیات را بر قسمت اندازه تصویر اعمال می کنیم.

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

شایعترین عملیات تلفیقی با فیلتر اندازه 2 × 2 با گام 2 انجام می شود. این در واقع نصف مقدار ورودی را کاهش می دهد.

حالا بیایید از بحث نظری بگذریم و به اجرای یک CNN برویم.

3. اجرای CNN ها در Keras

 

3.1 مجموعه داده – CIFAR10

مجموعه داده CIFAR10 همراه با Keras همراه است. این 50،000 تصویر آموزشی و 10،000 تصویر تست دارد. 10 کلاس مانند هواپیما، ماشین، پرنده، گربه، گوزن، سگ، قورباغه، اسب، کشتی و کامیون وجود دارد. تصاویر 32 × 32 اندازه هستند. در زیر چند نمونه هستند.

3.2 شبکه

برای اجرای یک CNN، ما لایه های Convolutional را با هم ترکیب می کنیم و سپس لایه های Max Pooling را می سازیم. ما همچنین از Dropout برای جلوگیری از اضافه کردن استفاده می کنیم. در نهایت، ما یک لایه کاملا متصل (انبساطی) و یک لایه softmax اضافه می کنیم. در زیر ساختار مدل است.

 

در کد بالا، ما از 6 لایه کانولوشن و 1 لایه کامل متصل استفاده می کنیم. خطوط 6 و 7 لایه کانولوشن را با 32 فیلتر / هسته با اندازه پنجره 3 × 3 اضافه می کند. به طور مشابه، در خط 10، یک لایه متنی با 64 فیلتر اضافه می کنیم. در خط 8، یک لایه حداکثر جمع کننده با اندازه پنجره 2 × 2 اضافه می کنیم. در خط 9، یک لایه رها کردن را با نسبت 0.2 به خروجی اضافه می کنیم. در خطوط نهایی ما لایه متراکمی را اضافه می کنیم که طبقه بندی را در میان 10 کلاس با استفاده از یک لایه softmax انجام می دهد.

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

این نشان می دهد که از آنجا که ما در لایه اول استفاده کرده ایم، شکل خروجی همانند ورودی است (32 × 32). اما لایه دوم دوم با دو پیکسل در هر دو ابعاد کوچک می شود. همچنین اندازه خروجی بعد از لایه pooling به دلیل اینکه از یک گام 2 و یک پنجره 2 × 2 استفاده کردیم، نصف شده است. لایه نهایی droupout دارای خروجی 2x2x64 است. این باید به آرایه تک تبدیل شود. این کار توسط لایه مسطح انجام می شود که آرایه 3D را به آرایه 1D از اندازه 2x2x64 = 256 تبدیل می کند. لایه نهایی دارای 10 گره از آنجا که 10 کلاس وجود دارد.

3.3. آموزش شبکه

برای آموزش شبکه، ما از گردش ساده ساده create -> compile -> fit در اینجا توضیح خواهیم داد. از آنجایی که این یک مشکل طبقه بندی 10 طبقه است، از یک قطعه انتروپی متقاطع متقارن استفاده می کنیم و از RMSProp بهینه ساز برای آموزش شبکه استفاده می کنیم. ما آن را برای چندین دوره اجرا خواهیم کرد. در اینجا ما آن را برای 100 دوره اجرا می کنیم.

 

3.4. افت و خطای دقیق

با توجه به زیر، منحنی های از دست دادن و دقت هستند.

از منحنی های بالا می توان دید که تفاوت بین آموزش و اعتبار سنجی از بین رفته است. این نشان می دهد که شبکه سعی کرده است داده های آموزشی را حفظ کند و بنابراین می تواند دقت بیشتری در مورد آن داشته باشد. این نشانه ای از Overfitting است. اما ما قبلا از Dropout در شبکه استفاده کرده ایم، پس چرا هنوز آن را بیش از حد تعریف می کنیم؟ بگذارید ببینیم آیا ما می توانیم با استفاده از چیز دیگری بیش از حد برآورد کنیم.

4. با استفاده از افزایش داده ها

یکی از دلایل اصلی اضافه کردن این است که شما اطلاعات کافی برای آموزش شبکه خود ندارید. به غیر از تنظیم، یکی دیگر از روش های بسیار موثر برای مقابله با Overfitting، Data Augmentation است. این روند مصنوعی ایجاد تصاویر بیشتر از تصاویری است که شما در حال حاضر با تغییر اندازه، جهت گیری و غیره از تصویر است. این می تواند یک کار خسته کننده باشد، اما خوشبختانه، این را می توان در Keras با استفاده از مثال ImageDataGenerator انجام داد.

 

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

4.1 آموزش با افزایش اطلاعات

همانند بخش قبل، ما مدل را ایجاد خواهیم کرد، اما در هنگام آموزش از افزایش داده استفاده خواهیم کرد. ما از ImageDataGenerator برای ایجاد یک ژنراتور که شبکه را تغذیه خواهد کرد.

 

در کد بالا

ما ابتدا مدل را ایجاد و پیکربندی کردیم.
سپس یک شی ImageDataGenerator ایجاد می کنیم و آن را با استفاده از پارامترهای تلنگر افقی و ترجمه تصویر پیکربندی می کنیم.
تابع datagen.flow () پس از انجام تحولات / افزایش داده ها در طی اکتیو کردن ژنراتور داده ها، مجموعه داده ها را تولید می کند.
تابع fit_generator مدل را با استفاده از داده های به دست آمده در دسته از عملکرد datagen.flow آموزش می دهد.
4.2 افت و خطای دقیق

 

دقت آزمایش بیشتر از دقت آموزش است. این بدان معنی است که مدل به خوبی تعریف شده است. این بدان علت است که این مدل بر روی اطلاعات بسیار بدتر (به عنوان مثال – تصاویر تلنگر شده) آموزش داده شده است، بنابراین یافته های داده های نرمال را آسان تر برای طبقه بندی می کند.

5. چه بعدی؟

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

درک توابع فعال سازی در یادگیری عمیق

در این پست، ما در مورد انواع مختلف توابع فعال یاد بگیریم؛ ما همچنین می بینیم که کدام تابع فعال تر بهتر از دیگر است. این پست فرض می کند که شما یک ایده اولیه از شبکه های عصبی مصنوعی (ANN) دارید، اما در صورتی که این کار را نکنید، توصیه می کنم ابتدا پست را در مورد درک شبکه های عصبی فیدبک بخوانید.

1. عملکرد فعال سازی چیست؟

شبکه های عصبی زیستی الهام بخش توسعه شبکه های عصبی مصنوعی بودند. با این حال، ANN حتی نمایشی تقریبی از عملکرد مغز نیست. هنوز هم مفید است که ارتباط یک تابع فعال سازی در یک شبکه عصبی بیولوژیک قبل از اینکه ما بدانیم که چرا از آن در شبکه عصبی مصنوعی استفاده می کنیم، قابل درک است.

یک نورون معمولی دارای ساختار فیزیکی است که شامل یک بدن سلولی است، یک آکسون که پیام را به دیگر نورون ها ارسال می کند و dendrites که سیگنال یا اطلاعات از دیگر نورون ها را دریافت می کند.

 

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

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

بگذارید همان مفهوم را دوباره درک کنیم اما این بار با استفاده از نورون مصنوعی.

 

در شکل بالا، (x_1، \ cdots، x_n) یک بردار سیگنال است که با وزن \ left (w_1، w_2، \ cdots، w_n \ right) ضرب می شود. این به دنبال انباشت (به عنوان مثال جمع شدن + اضافه کردن تعصب b). در نهایت یک تابع فعال f برای این مقدار اعمال می شود.

توجه داشته باشید که وزن \ left (w_1، w_2، \ cdots، w_n \ right) و bias b تبدیل سیگنال ورودی به صورت خطی. از سوی دیگر فعال سازی، سیگنال غیر خطی را تبدیل می کند و این غیر خطی بودن است که به ما امکان می دهد تا تغییرات پیچیده ای را در میان ورودی و خروجی یاد بگیریم.

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

2. شبکه چگونه یاد می گیرد؟

ضروری است که یک ایده اساسی در مورد نحوه یادگیری شبکه عصبی بدست آوریم. بیایید بگوییم خروجی مورد نظر از شبکه y است. شبکه خروجی Y تولید می کند. تفاوت بین خروجی پیش بینی شده و خروجی مورد نظر (y – y) به یک متریک شناخته شده به عنوان عملکرد تلفات (J) تبدیل می شود. وقتی شبکه عصبی اشتباهات زیادی را انجام می دهد، از دست دادن بالا است، و زمانی که اشتباهات کمتری انجام می شود کم است. هدف از فرایند آموزش این است که وزن و تعصب را پیدا کنیم که عملکرد تضعیف را در مجموعه آموزشی کاهش می دهد.

در شکل زیر، عملکرد از دست دادن مانند یک کاسه شکل می گیرد. در هر نقطه ای از فرایند آموزش، مشتقات جزئی از کار افتادن w.r.t به وزن، چیزی جز شیب کاسه در آن محل نیست. می توان دید که با حرکت در جهت پیش بینی شده توسط مشتقات جزئی، ما می توانیم به پایین کاسه برسیم و بنابراین عملکرد تلفات را به حداقل برسانیم. این ایده استفاده از مشتقات جزئی یک تابع به منظور تکرار آن حداقل محلی را نام می برد.

در شبکه های عصبی مصنوعی وزن با استفاده از روش به نام Back propagation به روز می شود. مشتقات جزئی از عملکرد از دست دادن w.r.t وزن برای به روز رسانی وزن استفاده می شود. به یک معنا، خطا در شبکه با استفاده از مشتقات پخش می شود. این کار به صورت تکراری انجام می شود و پس از بسیاری از تکرارها، از دست دادن به حداقل مقدار می رسد و مشتق از دست دادن صفر می شود.

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

3. انواع توابع فعال

تابع فعال سازی خطی: یک تابع خطی ساده از فرم f (x) = x به طور معمول، ورودی به خروجی منتقل می شود بدون هیچ گونه تغییری.

توابع فعال غیرخطی: این توابع برای جدا کردن داده هایی که به صورت خطی قابل جدا شدن نیستند و بیشترین استفاده از توابع فعال سازی هستند استفاده می شود. معادله غیر خطی، نقشه برداری از ورودی ها به خروجی ها را مدیریت می کند. چند نمونه از انواع مختلف توابع فعال سازی غیر خطی عبارتند از sigmoid، tanh، relu، lrelu، prelu، swish، و غیره. ما در مورد تمام این توابع فعال با جزئیات صحبت خواهیم کرد.

4. چرا ما یک تابع فعال سازی غیر خطی در یک شبکه عصبی مصنوعی نیاز داریم؟

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

بیایید مثال ساده ای را بدانیم که چرا بدون غیر خطی بودن می توان عملکردهای ساده ای مانند XOR و XNOR را تعریف کرد. در شکل زیر، ما گرافیکی یک دروازه XOR را نشان می دهیم. دو مجموعه در مجموعه داده های ما وجود دارد که نشان دهنده یک صلیب و یک دایره است. وقتی دو ویژگی، X1 و X2 یکسان هستند، برچسب کلاس یک کراس قرمز است، در غیر اینصورت، یک دایره آبی است. دو ردیف قرمز خروجی 0 برای مقدار ورودی (0،0) و (1،1) و دو حلقه آبی دارای خروجی 1 برای مقدار ورودی (0،1) و (1،0) است.

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

تابع فعال سازی نیز برای خنثی کردن خروجی شبکه عصبی در محدوده معینی ضروری است. خروجی یک نورون \ sum ^ n_i w_i x_i + b می تواند مقادیر بسیار زیادی داشته باشد. این خروجی، وقتی که به نورون لایه بعدی بدون اصلاح تغذیه می شود، می تواند به اعداد حتی بزرگتر تبدیل شود و بدین ترتیب پردازش را به صورت محاسباتی قابل اجتناب کند. یکی از وظایف تابع فعال سازی این است که خروجی یک نورون را به چیزی که محدود است (به عنوان مثال، بین 0 و 1) محدود کنیم.

با این پس ما آماده هستیم تا انواع مختلفی از توابع فعال سازی را درک کنیم.

5. انواع توابع فعال سازی غیر خطی

5.1 سیگموئید

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

شکل زیر نمودار عملکرد سیگموئید و مشتق آن را به صورت گرافیکی نشان می دهد

سه ضعف اصلی سیگموئید عبارتند از:

شیب ناپایدار: توجه کنید که تابع سیگموئید نزدیک به 0 و 1 مسطح است. به عبارت دیگر، گرادیان سیگموید 0 در نزدیکی 0 و 1 است. در طول بازگشت از طریق شبکه با فعال شدن سیگموئید، گرادیان در نورون هایی که خروجی آنها نزدیک 0 یا 1 تقریبا 0. این نورون ها نورون های اشباع نامیده می شوند. بنابراین، وزن این نورون ها به روز نمی شود. نه تنها این، وزن نورون هایی که به این نورون ها متصل هستند نیز به آرامی به روز می شوند. این مشکل همچنین به عنوان گرادیان ناپایدار شناخته شده است. بنابراین، تصور کنید اگر یک شبکه بزرگ شامل نورون های سیگموئید وجود داشته باشد که بسیاری از آنها در یک رژیم اشباع قرار دارند، شبکه نمی تواند به عقب رانده شود.
صفر مرکز: خروجی های Sigmoid صفر محور نیستند.
محاسبه گران: عملکرد exp () در مقایسه با سایر توابع فعال سازی غیرخطی گران محاسباتی گران است.
تابع فعال سازی غیر خطی بعدی که من میخواهم بحث کنم به مشکل صفر محور در سیگموئید می پردازد.

 

5.2. Tanh

همچنین به عنوان تابع فعال سازی مماسی هذلولی شناخته می شود. همانند sigmoid، tanh نیز یک عدد ارزش واقعی را می گیرد، اما آن را به محدوده بین -1 و 1 تقسیم می کند. بر خلاف سیگموئید، خروجی های tanh صفر محور هستند، زیرا محدوده بین -1 و 1 است. شما می توانید از یک تابع tan به عنوان دو سیگموئید با هم قرار گرفته اند. در عمل، tanh بیش از sigmoid ترجیح داده است. ورودی های منفی که به عنوان منفی بسیار منفی، ارزش ورودی صفر به صفر نزدیک می شوند و ورودی های مثبت در نظر گرفته شده اند. تنها نکته تانش این است:

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

 

5.3. Rectified Linear Unit (ReLU)

همانطور که می توانید از شکل بالا بدانید، ReLU از پایین به نصف رفع شده است. از نظر ریاضی، از این عبارت ساده استفاده می شود

این به این معنی است که هنگام ورودی x <0 خروجی 0 است و اگر x> 0 خروجی x باشد. این فعال شدن باعث می شود که شبکه خیلی سریعتر هماهنگ شود. این اشباع نمی کند، به این معنی است که آن را در برابر مسئله شیب گسیختگی حداقل در ناحیه مثبت (زمانی که x> 0) مقاوم است، بنابراین نورون ها تمام صفر را در حداقل نیمی از مناطق خود تکثیر نمی کنند. ReLU محاسباتی بسیار کارآمد است زیرا با استفاده از آستانه ساده ساده سازی شده است. اما نقاط ضعف Neuron ReLU وجود دارد:

صفر محور: خروجی ها صفر محور مانند تابع فعال سازی sigmoid نیستند.
مسئله دیگر با ReLU این است که اگر x <0 در طول پاس رو به جلو، نورون غیر فعال باقی بماند و در طول گذر عقب، گرادیان را از بین می برد. بنابراین وزن ها به روز نمی شوند و شبکه یاد نمی گیرد. هنگامی که x = 0، شیب در آن نقطه تعریف نشده است، اما این مشکل در حین اجرای با انتخاب چارچوب یا شیب سمت راست مورد توجه قرار گرفته است.
برای رفع مسئله گرادیان ناپدید در تابع فعال سازی ReLU زمانی که x <0 ما چیزی به نام Leaky ReLU داشتیم که تلاش برای رفع مشکل ReLU مرده بود. بیایید دقیق ReLU نشت را درک کنیم.

 

5.4. Leaky ReLU

این تلاش برای کاهش مشکل ReLU در حال مرگ بود. تابع محاسبه می کند

مفهوم ReLU نشت زمانی است که x <0، آن یک شیب مثبت کوچک 0.1 را دارد. این کار تا حدی مشکل ReLU در حال مرگ را از بین می برد، اما نتایج به دست آمده با آن سازگار نیستند. اگرچه تمام خصوصیات یک تابع فعال سازی ReLU، به عنوان مثال، کارآیی محاسباتی، بسیار سریع تر هماهنگ می شود، در منطقه مثبت اشباع نمی شود.

ایده ReLU نشتی را می توان حتی بیشتر گسترش داد. به جای ضرب x با یک اصطلاح دائمی، می توان آن را با یک پارامتر ضرب کردیم که به نظر می رسد ReLU نشتی بهتر کار می کند. این فرمت به ReLU نشت داده شده به عنوان پارامتریک ReLU شناخته می شود.

5.5 پارامتریک ReLU

عملکرد PReLU توسط داده می شود

 

کجا \ alpha یک hyperparameter است. ایده در اینجا این بود که یک hyperparameter \ alpha خودسرانه را معرفی کنیم و این \ alpha را می توان یاد گرفت زیرا شما می توانید به آن بازگردید. این باعث می شود که نورون ها توانایی انتخاب شیله ای را در منطقه منفی داشته باشند و با این توانایی، آنها می توانند ReLU یا ReLU نشت کنند.

به طور خلاصه، بهتر است از ReLU استفاده کنید، اما می توانید با Leaky ReLU یا پارامتریک ReLU آزمایش کنید تا ببینید آیا نتایج بهتر شما برای مشکل شما فراهم می شود

 

5.6. SWISH

به تازگی توسط محققان در Google منتشر شده است که همچنین به عنوان یک تابع فعال سازی خود به خود شناخته شده است. از نظر ریاضی، آن را به عنوان نشان داده شده است

بر طبق این مقاله، تابع فعال SWISH بهتر از ReLU انجام می شود

از شکل بالا می توان دید که در ناحیه منفی محور x شکل دم از تابع فعال سازی ReLU متفاوت است و به همین دلیل خروجی از عملکرد Activation Swish حتی ممکن است حتی زمانی که مقدار ورودی افزایش می یابد کاهش یابد. اکثر توابع فعال یکسان هستند، به عنوان مثال، مقدار آنها هرگز به دلیل افزایش ورودی کاهش نمی یابد. Swish دارای ویژگی محدودیتی یک طرفه در صفر است، صاف و یکنواخت نیست. جالب خواهد بود بدانید که با تغییر تنها یک کد از کدام کار، آن را انجام می دهد.

درک شبکه های عصبی Feedforward

درک شبکه های عصبی Feedforward

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

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

 

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

1. درک شبکه عصبی

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

1.1 نورون چیست؟

نورون مصنوعی واحد اصلی یک شبکه عصبی است که در زیر تصویر آن نشان داده شده است.

 

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

1.2 توابع فعال سازی

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

  • Sigmoid

    این تابع ورودی (محور x ) را به مقادیر بین 0 و 1 تبدیل می کند.

     

  • Tanh

    این تابع مشابه sigmoid است اما ورودی را به مقادیر بین -1 و 1 می برد.

  • (Rectified Linear Unit (ReLU

این تابع اجازه می دهد که فقط مقادیر مثبت از طریق آن عبور کنند. مقادیر منفی به صفر می رسند.

توابع دیگر هم مانند تابع پله واحد ، ReLU نشتی، ReLU نویزی ، LU  نمایی و غیره وجود دارند که هر کدام مزایا و معایبی دارند.

1.3 لایه ورودی

این لایه اول یک شبکه عصبی است. که برای ارائه داده های ورودی یا ویژگی های به شبکه استفاده می شود.

1.4 لایه خروجی

این لایه  عملیات پیش بینی را انجام می دهد. در این لایه  از توابع فعال سازی استفاده می کنیم که برای هر مسئله متفاوت است . برای یک مسئله طبقه بندی باینری، ما می خواهیم که خروجی 0 یا 1 باشد. بنابراین، یک تابع فعال سازی sigmoid استفاده می کنیم. برای یک مسئله طبقه بندی چند کلاسه، از Softmax (به عنوان یک تعمیم از sigmoid برای  مسائل چند کلاسه) استفاده می شود. برای یک مسئله رگرسیون، که در آن خروجی یک کلاس از پیش تعریف شده نیست، ما می توانیم به سادگی از یک واحد خطی استفاده کنیم.

1.5. لایه پنهان

در یک شبکه feedforward مجموعه ای از توابع را به ورودی اعمال می کنیم. با داشتن چندین لایه پنهان، می توانیم توابع پیچیده را با توابع ساده ی مرحله ای محاسبه کنیم. فرض کنید ما می خواهیم توان 7 یک  عدد  را محاسبه کنیم، اما می خواهیم همه چیز را ساده نگه داریم . شما می توانید توابع ساده تر مانند مرتبه دوم و سوم را برای محاسبه توابع مرتبه بالاتر استفاده کنید. به طور مشابه، شما می توانید توابع خیلی پیچیده تری را با این اثر آبشاری محاسبه کنید.اکثر واحد های مخفی در این مسئله از  ReLU به عنوان تابع فعال سازی استفاده می کنند.

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

1.6 شبکه چگونه یاد می گیرد؟

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

2. چرا از لایه های مخفی استفاده کنیم؟

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

 

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

 

2.1 بدون لایه پنهان

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

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

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

در حال حاضر، اگر دومین داده را انتخاب کنید، همان تنظیمات نمی تواند مرز تصمیم مناسب را یاد بگیرد.

به نظر می رسد که مرز تصمیم گیری یک بخش مخروطی است (مثل یک قاعده یا هیبرالی). بنابراین، اگر ضرب ویژگی ها (یعنی X1X2) را دخالت دهیم، نورون قادر است مرز تصمیم گیری مورد نظر را یاد بگیرد.

از آزمایش فوق، ما موارد زیر را مشاهده کردیم:

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

2.2 اضافه کردن یک لایه پنهان

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

3. منظم سازی

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

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

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

پس از تنظیم L2، مرز تصمیم گیری توسط شبکه آموزش داده می شود، نرمتر و شبیه به مواردی است که نویزی وجود ندارد. تاثیر regularization  را می توان از منحنی های loss و مقادیر وزن ها دید.

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

شناسایی اشیاء از طریق یادگیری عمیق

الگوریتم R_CNN  به عنوان الگوریتم پایه شناسایی اشیا از طریق یادگیری عمیق محسوب می شود.این الگوریتم راه را برای محققان برای ساخت الگوریتم پیچیده تر و بهتر بر روی این الگوریتم فراهم کرد. من سعی می کنم R-CNN و سایر انواع آن را توضیح بدم.

 

شبکه های عصبی کانولوشن بر پایه نواحی (R-CNN) :

R-CNN شامل 3 مرحله ساده است:

  • تصویر ورودی را جهت اشیاء احتمالی  با استفاده از الگوریتم  Selective Search اسکن می کند و پس از آن تقریباً  2000  ناحیه پیشنهادی تولید می کند .
  • اجرای یک شبکه عصبی کانولوشن (CNN) بروی هر یک از این نواحی پیشنهادی .
  • خروجی هر CNN به دو بخش انتقال می دهد اولی  یک SVM برای طبقه بندی ناحیه و دومی  یک رگرسیون خطی برای تنظیم کردن ناحیه  شی، اگر چنین آبجکتی وجود داشته باشد.

شبکه های عصبی کانولوشن سریع بر پایه نواحی ( Fast R-CNN):

روش Fast R-CNN بلافاصله پس از روش R-CNN  ایجاد شد. با توجه به نکات زیر این روش بهتر و سریع تر از روش قبل است :

 

  • انجام عملیات استخراج ویژگی از تصویر قبل از مرحله نواحی پیشنهادی، در نتیجه اجرای فقط یک CNN بروی کل تصویر، به جای اجرای 2000 CNN بروی 2000 نواحی همپوشانی.
  • جایگزینی SVM با یک لایه softmax

 

بدین ترتیب جایگزینی  2000 کانولوشن با یک کانولوشن که تمامی نواحی پیشنهادی توسط آن ایجاد می شود.

 

شبکه های عصبی کانولوشن سریع تر بر پایه نواحی ( Faster R-CNN):

  • یکی از نقاط ضعف Fast R-CNN، الگوریتم کند  selective search بود و Faster R-CNN چیزی به نام Region Proposal network (RPN) معرفی کرد.در اینجا کار RPN است:

    در آخرین لایه CNN اولیه، یک پنجره کشویی 3×3 حرکت می کند که در نقشه ویژگی قرار دارد و آن را به ابعاد پایین تر (مانند 256-d) می دهد. برای هر پنجره مکانی کشویی، چندین ناحیه ممکن را بر اساس k ثابت نسبت جعبه (جعبه محدوده پیش فرض)

    هر ناحیه پیشنهادی شامل اطلاعات زیر است:

  • یک امتیاز برای هر ناحیه.
  • خود ناحیه که متشکل از 4 نقطه است  ما در نقشه ویژگی مجموعه ای از نقاط را استخراج می کنیم و k تا ناحیه مختلف در اطراف این نقطه در نظر می گیریم همانطور که در شکل نشان داده شده یکی مستطیل نرمال ، عمودی ، افقی و بزگ و ….هستش.

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