کدنویسی شبکه های عصبی مصنوعی چند لایه در پایتون – راهنمای کامل

۲۵۳۲ بازدید
آخرین به‌روزرسانی: ۲۱ تیر ۱۴۰۲
زمان مطالعه: ۲۳ دقیقه
دانلود PDF مقاله
کدنویسی شبکه های عصبی مصنوعی چند لایه در پایتون – راهنمای کاملکدنویسی شبکه های عصبی مصنوعی چند لایه در پایتون – راهنمای کامل

بنابر «قضیه عمومی تقریب» (Universal Approximation Theorem)، در صورتی که تعداد مناسبی از لایه‌ها (لایه‌های نهان) در «شبکه های عصبی مصنوعی» (Artificial Neural Networks) طراحی شود و «حاشیه خطای» (Error Margin) مطلوبی برای این دسته از الگوریتم‌های حوزه «هوش مصنوعی» (Artificial Intelligence) و «یادگیری ماشین» (Machine Learning) تعریف شود، این مدل‌ها قادر هستند تا هر نوع «تابعی» (Function) را تقریب بزنند، یاد بگیرند و نمایش دهند.

997696

شبکه های عصبی مصنوعی چند لایه، معمولا با استفاده از مدل‌سازی یک نمایش‌‌ پیچیده روی نمایش‌های ساده‌تر از داده‌ها، رفتار توابع و مدلسازی یک «تابع واقعی» (True Function) مبتنی بر داده را یاد می‌گیرند. منظور از تابع واقعی، مدل تابعی است که می‌تواند داده‌های مسئله را به بهترین شکل ممکن دسته‌بندی کند.

در هر کدام از «لایه‌های نهان» (Hidden Layers) تعبیه شده در مدل‌های شبکه عصبی، ابتدا با استفاده از یک «تبدیل خطی» (Linear Transformation) از داده‌های ورودی داده شده و در مرحله بعد، اعمال کردن یک «تابع غیرخطی» (Non-Linear Function)، شبکه عصبی قادر به یادگیری «فضای ویژگی» (Feature Space) جدید خواهد بود. حاصل این عملیات (خروجی این مراحل)، ورودی لایه بعدی را تشکیل خواهد داد. این فرایند تا زمانی که خروجی‌ها به لایه آخر یا «لایه خروجی» (Output Layer) برسند، ادامه پیدا می‌کند.

شبکه های عصبی مصنوعی (Artificial Neural Networks)

بنابراین، یک شبکه عصبی را می‌توان در قالب جریان اطلاعاتی از لایه ورودی به لایه‌های نهان و پس از آن به لایه خروجی تعریف کرد. برای یک «شبکه عصبی سه لایه» (Three-Layers Neural Network)، تابع واقعی که قرار است توسط شبکه یادگیری شود، به شکل زیر نمایش داده خواهد شد:

f(x)=f3(f2(f1(x)))f ( x ) = f _ { 3 } ( f _ { 2 } ( f _ { 1 } ( x ) ) )

در این تابع، هر کدام از توابع تو در توی داخلی وظیفه خاصی بر عهده دارند:

  • تابع f1(x)f _ { 1 } ( x ): تابعی که در لایه نهان اول شبکه های عصبی مصنوعی یاد گرفته خواهد شد.
  • تابع f2(x)f _ { 2 } ( x ): تابعی که در لایه نهان دوم شبکه های عصبی مصنوعی یاد گرفته خواهد شد.
  • تابع f3(x)f _ { 3 } ( x ): تابعی که در لایه خروجی شبکه های عصبی مصنوعی یاد گرفته خواهد شد.

به عبارت دیگر، در هر کدام از لایه‌های شبکه های عصبی مصنوعی چند لایه، مدل‌های نمایشی متفاوتی یاد گرفته می‌شود. البته نکته مهم در مورد یادگیری توابع بالا این است که هر چه قدر به سمت لایه‌های نهان انتهایی حرکت می‌کنیم، مدل نمایشی یادگیری شده در شبکه های عصبی مصنوعی، پیچیده‌تر و پیشرفته‌تر می‌شود. شکل زیر، نمونه‌ای از یک شبکه عصبی سه لایه را نمایش می‌دهد (معمولا لایه اول، در محاسبه تعداد لایه‌های شبکه های عصبی مصنوعی لحاظ نمی‌شود).

شبکه های عصبی مصنوعی (Artificial Neural Networks)
معماری یک شبکه عصبی مصنوعی چند لایه

به عنوان نمونه، کامپیوترها درکی از تصاویر دیجیتالی ندارند و به طور مستقیم، قادر به استنتاج در مورد مؤلفه‌های سازنده یک تصویر نیستند. از سوی دیگر، یک سیستم کامپیوتری بدون وجود یک مدل نرم‌افزاری (هوشمند)، قادر به انجام عملیات جهت استخراج اطلاعات بامعنی از تصاویر نیست. با این حال، شبکه های عصبی مصنوعی به راحتی قادر خواهند بود با استفاده از مدل‌سازی یک نمایش ساده از تصویر در لایه‌های نهان ابتدایی، «لبه‌های» (Edges) موجود در تصویر را شناسایی کنند.

شبکه های عصبی مصنوعی چند لایه، با داشتن خروجی متناظر با اولین لایه نهان، به راحتی می‌توانند «گوشه‌ها» (Corners) و «کانتورهای» (Contours) موجود در تصویر را تشخیص دهند. همچنین، این شبکه‌های عصبی، با داشتن خروجی متناظر با لایه نهان دوم، بخش‌های خاصی از یک تصویر نظیر بینی یک انسان را شناسایی می‌کنند. در نهایت، و با در کنار هم قرار دادن تمامی مدل‌های نمایشی تولید شده در لایه‌های نهان و تولید یک مدل نمایشی پیچیده، شبکه های عصبی مصنوعی قادر خواهند بود تا نوع اشیاء موجود در تصویر را نیز شناسایی کنند.

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

یکی از بخش‌های مهم طراحی یک مدل یادگیری ماشین، «مهندسی ویژگی‌ها» (Feature Engineering) یا مشخص کردن بهترین ویژگی‌های ممکن برای تولید یک مدل نمایشی بهینه است. ویژگی مهم شبکه های عصبی مصنوعی این است که به «مهندسان هوش مصنوعی» (AI Engineers) و «دانشمندان داده» (Data Scientists) این امکان را می‌دهند که بدون صرف کردن وقت و هزینه زیاد روی بخش مهندسی ویژگی‌ها، یک مدل نمایشی خوب از داده‌ها تولید و در کاربردهای مختلف مورد استفاده قرار دهند.

مطلب پیش رو از دو بخش اصلی تشکیل شده است:

  1. کدنویسی شبکه های عصبی مصنوعی چند لایه: در این بخش، نحوه تعریف توابع کمکی لازم برای پیاده‌سازی شبکه های عصبی مصنوعی چند لایه تشریح و کدهای پیاده‌سازی آن‌ها در «زبان برنامه‌نویسی پایتون» (Python Programming Language) نمایش داده خواهد شد. همچنین، بنیان نظری بخش‌های مختلف پیاده‌سازی شبکه های عصبی مصنوعی نیز شرح داده خواهد شد.
  2. کاربرد: در این بخش، از کدهای پیاده‌سازی شده در بخش قبل، برای توسعه یک سیستم «بازشناسی تصویر» (Image Recognition) استفاده می‌شود. از سیستم بازشناسی تصویر، برای سنجش عملکرد شبکه عصبی مصنوعی در تشخیص «گربه» (Cat) یا «غیر گربه» (No Cat) در تصاویر ورودی استفاده می‌شود.

کدنویسی شبکه های عصبی مصنوعی چند لایه

در این بخش، با بخش‌های مختلف الگوریتم یادگیری در یک شبکه عصبی مصنوعی چند لایه آشنا خواهید شد.

شبکه های عصبی مصنوعی (Artificial Neural Networks)

انتشار رو به جلو (Forward Propagation)

ورودی XX، اطلاعات ابتدایی لازم را در مورد دامنه مسئله‌ای که قرار است توسط شبکه های عصبی مصنوعی حل شود، در اختیار سیستم قرار می‌دهد. در مراحل بعد، ورودی‌ها به واحدها یا «نودهای» (Nodes) موجود در هر کدام از لایه‌ها انتشار پیدا می‌کنند و در نهایت، یک خروجی Y^\widehat { Y } تولید می‌شود. برای مشخص کردن معماری شبکه های عصبی مصنوعی، لازم است تا «عمق» (Depth)، «پهنا» (Width) و «تابع فعال‌سازی» (Activation Function) که در هر لایه مورد استفاده قرار می‌گیرد، مشخص شوند.

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

برای پیاده‌سازی شبکه های عصبی مصنوعی، توابع فعال‌سازی گوناگونی نظیر «واحد خطی اصلاح شده» (Rectified Linear Unit)، «تابع سیگموئید» (Sigmoid Function)، «تابع تانژانت هذلولوی یا هیپربولیک» (Hyperbolic Tangent) و سایر موارد معرفی شده‌اند. تحقیقات انجام شده در مورد پیاده‌سازی شبکه های عصبی مصنوعی نشان داده است که شبکه‌های عمیق‌تر (شبکه‌های حاوی لایه‌های نهان بیشتر)، عملکرد به مراتب بهتری نسبت به شبکه‌های حاوی نودهای نهان بیشتر دارند.بنابراین، آموزش یک شبکه عصبی مصنوعی عمیق‌تر توصیه می‌شود.

ابتدا لازم است تا برخی از نمادهایی که در طول این مطلب با آن‌ها برخورد می‌شود، تعریف شوند:

  • ماتریس WlW ^ { l }: ماتریس وزن لایه llاُم.
  • بردار blb ^ { l }: بردار بایاس لایه llاُم.
  • تابع ZlZ ^ { l }: تابع تبدیل خطی ورودی‌های داده شده برای لایه llاُم.
  • تابع glg ^ { l }: تابع فعال‌سازی که روی لایه llاُم شبکه عصبی مصنوعی اعمال می‌شود.
  • مقدار AlA ^ { l }: خروجی حاصل پس از اعمال تابع فعال‌سازی روی لایه llاُم شبکه عصبی مصنوعی.
  • مقدار dWld W ^ { l }: مشتق «تابع هزینه» (Cost Function) نسبت به WlW ^ { l } (J(Wl)\frac { \partial J } { \partial (W ^ l ) }).
  • مقدار dbld b ^ { l }: مشتق «تابع هزینه» (Cost Function) نسبت به blb ^ { l } (J(bl)\frac { \partial J } { \partial (b ^ l ) }).
  • مقدار dZld Z ^ { l }: مشتق «تابع هزینه» (Cost Function) نسبت به ZlZ ^ { l } (J(Zl)\frac { \partial J } { \partial (Z ^ l ) }).
  • مقدار dAld A ^ { l }: مشتق «تابع هزینه» (Cost Function) نسبت به AlA ^ { l } (J(Al)\frac { \partial J } { \partial (A ^ l ) }).
  • مقدار nln ^ { l }: تعداد واحدها یا نودهای لایه llاُم.
  • مقدار mm: تعداد نمونه‌ها.
  • مقدار LL: تعداد لایه‌های موجود در شبکه عصبی مصنوعی طراحی شده (بدون در نظر گرفتن لایه ورودی).

در مرحله بعد، «ابعاد» (Dimensions) یک شبکه عصبی چند لایه به «شکل عمومی» (General Form) نمایش داده خواهد شد تا عملیات ضرب ماتریسی در شبکه تسهیل شود. یکی از مهم‌ترین چالش‌های موجود در پیاده‌سازی شبکه های عصبی مصنوعی، محاسبه درست ابعاد آن‌ها است.

  • مقادیر (Wl  ,dWlW ^ { l } \; , d W ^ { l }): تعداد نودهای موجود در لایه llاُم شبکه x تعداد نودهای موجود در لایه (l1)(l-1)اُم.
  • مقادیر (bl  ,dblb ^ { l } \; , d b ^ { l }): تعداد نودهای موجود در لایه llاُم شبکه x عدد (1).
  • مقادیر (Zl  ,dZlZ ^ { l } \; , d Z ^ { l }): تعداد نودهای موجود در لایه llاُم شبکه x تعداد نمونه‌ها.
  • مقادیر (Al  ,dAlA ^ { l } \; , d A ^ { l }): تعداد نودهای موجود در لایه llاُم شبکه x تعداد نمونه‌ها.

دو معادله‌ای که از طریق آن‌ها قادر به پیاده‌سازی مرحله انتشار رو به جلو خواهیم بود عبارتند از:

Zl=Wl  Al1+blZ ^ { l } = W ^ { l } \; A ^ { l - 1 } + b ^ { l }

Al=gl(Zl)=gl(wlAl1+bl)A ^ { l }= g ^ { l } ( Z ^ { l } ) =g ^ { l } ( w ^ { l } A ^ { l - 1 } + b ^ { l } )

محاسباتی که به وسیله این معادلات انجام می‌شوند، در تمامی لایه‌های شبکه های عصبی مصنوعی اتفاق می‌افتند.

مقداردهی اولیه پارامترها

در ابتدای کار، ماتریس‌های وزن و بردارهای بایاس متناظر با هر کدام از لایه‌ها، مقداردهی اولیه خواهند شد. شایان ذکر است که مقادیر پارامترهای مسئله نباید توسط مقادیر صفر مقداردهی اولیه شوند؛ زیرا، با انجام چنین کاری، «گرادیان‌ها» (Gradients) محاسبه شده برای تمامی حالات برابر خواهد شد و در هر تکرار، خروجی یکسان خواهد شد. در نتیجه، الگوریتم شبکه عصبی مصنوعی، عملا چیزی یاد نخواهد گرفت. بنابراین، بسیار حیاتی است که پارامترهای شبکه های عصبی مصنوعی به وسیله مقادیر تصادفی بین 0 و 1 مقداردهی اولیه شوند.

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

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

یکی از چالش‌هایی که توسعه دهندگان در هنگام پیاده‌سازی شبکه های عصبی مصنوعی با آن دست و پنجه نرم می‌کنند، انتخاب تابع فعال‌سازی مناسب برای لایه‌های مختلف موجود در شبکه عصبی است. در این زمینه، راهکاری قطعی برای انتخاب بهترین تابع فعال‌سازی برای یک مسأله خاص وجود ندارد. انتخاب تابع فعال‌سازی مناسب، یک فرایند «آزمون و خطا» (Trial and Error) است که در آن، توسعه دهنده، مجموعه‌ای از توابع متفاوت را امتحان و بهترین تابع را برای مسأله مورد نظر انتخاب می‌کند.

شبکه های عصبی مصنوعی (Artificial Neural Networks)
مهم‌ترین توابع فعال‌سازی شبکه‌های عصبی مصنوعی

در این بخش، چهار تابع فعال‌سازی مهم و پر کاربرد در پیاده‌سازی شبکه های عصبی مصنوعی مورد بررسی قرار می‌گیرند:

  • تابع سیگموئید: از آنجایی که برد مقادیر خروجی این تابع بین صفر و یک است، به شدت توصیه می‌ود که از این تابع فعال‌سازی در لایه خروجی استفاده شود تا به راحتی بتوان خروجی‌ها را در قالب مقادیر «احتمالی» (Probability) تفسیر کرد. یکی از معایب استفاده از تابع سیگموئیدی، به عنوان تابع فعال‌سازی در لایه‌های نهان، این است که مقادیر گرادیان‌ها در بخش بزرگی از دامنه مسأله، بسیار نزدیک به صفر خواهند بود؛ در نتیجه، الگوریتم یادگیری بسیار کند و کار آن برای مدل‌سازی داده‌ها بسیار سخت خواهد شد.

g(Z)=11+ezg ( Z ) = \frac { 1 } { 1 + e^ { -z } }

  • تابع تانژانت هذلولوی یا هیپربولیک: از آنجایی که «میانگین» (Mean) خروجی این تابع بسیار نزدیک به صفر است، نسبت به تابع سیگموئیدی برتری دارد. زیرا، مرکزیت خروجی واحدهای فعال‌سازی در اطراف صفر قرار می‌گیرد و این سبب می‌شود که برد مقادیر خروجی، بسیار کوچک و فرایند یادگیری، سریع‌تر انجام شود. یکی از معایب استفاده از تابع تانژانت هذلولوی یا هیپربولیک، به عنوان تابع فعال‌سازی در لایه‌های نهان (که با تابع سیگموئیدی در اشتراک است)، این است که مقادیر گرادیان‌ها در بخش بزرگی از دامنه، بسیار نزدیک به صفر خواهند بود.

g(Z)=ez+ezez+ezg ( Z ) = \frac { e ^ { z } + e ^ { -z } } { e ^ { z } + e ^ { -z } }

  • تابع «واحد خطی اصلاح شده» (ReLU): مدل‌های نزدیک به مدل خطی بسیار ساده هستند و بهینه‌سازی آن‌ها نیز بسیار آسان است. از آنجایی که تابع ReLU، بسیاری از مشخصه‌های توابع خطی را به اشتراک می‌گذارد، در بسیاری از مسائل کارایی خوبی از خود نشان می‌دهد. تنها مشکل این توابع این است که مشتق آن‌ها در Z=0Z=0 تعریف نمی‌شود. راه حل این مشکل این است که در Z=0Z=0، مشتق برابر صفر در نظر گرفته شود. با این حال، این بدین معنی است که برای تمامی مقادیر Z0Z \leq 0، گرادیان برابر صفر خواهد شد و الگوریتم قادر به یادگیری نخواهد بود.

g(Z)=max{0,Z}g ( Z ) = max \left \{ 0, Z \right \}

  • تابع «واحد خطی اصلاح شده نشتی» (Leaky ReLU): این تابع، از طریق اختصاص مقدار α\alpha (مقداری کوچک) به تمامی مقادیر Z0Z \leq 0، بر مشکل «گرادیان صفر» (Zero Gradient) فائق آمده است.

g(Z)=max{αZ,  Z}g ( Z ) = max \left \{ \alpha \star Z , \; Z \right \}

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

نمایش گرافی توابع فعال‌سازی:

شبکه های عصبی مصنوعی (Artificial Neural Networks)
نمایش گرافی توابع فعال‌سازی

فرایند پیشخور (Feedforward) در شبکه های عصبی مصنوعی‎

هر واحد یا نود موجود در لایه‌های شبکه عصبی مصنوعی (به جز نودهای لایه ورودی)، با داشتن ورودی‌ها از لایه قبلی (خروجی لایه قبلی، ورودی لایه بعدی خواهد بود)، تبدیل خطی Z=WTx+bZ = W ^ { T } x + b ورودی‌ها را محاسبه و تابع فعال‌سازی g(z)g ( z ) نظیر ReLU را، به صورت «عنصر به عنصر» (Element-Wise) بر روی عناصر آن اعمال می‌کند.

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

تابع هزینه (Cost) در شبکه های عصبی مصنوعی

در این مطلب، از تابع هزینه باینری «آنتروپی متقابل» (Cross-Entropy) استفاده می‌شود. این روش، از «درست‌نمایی بر حسب لگاریتم» (Log-Likelihood) برای محاسبه خطا استفاده می‌کند. تابع هزینه به شکل زیر تعریف می‌شود:

J(W,b)=1mi=1m(yilog(yi^)+(1yi)log(1yi^))J ( W , b) = - \frac { 1 } { m } \Large {\sum} _ { i = 1 } ^ m ( y ^ { i } log ( \widehat { y ^ { i } } ) + ( 1 - y ^ { i } ) log ( 1 -\widehat { y ^ { i } } ) )

تابع هزینه بالا، یک تابع محدب است؛ با این حال، شبکه عصبی معمولا در دام «کمینه محلی» (Local Minimum) قرار می‌گیرد و تضمینی برای رسیدن به پارامترهای «بهینه سراسری» (GLobal Optimum) وجود ندارد. در این مطلب، الگوریتم یادگیری شبکه عصبی، از روش «گرادیان کاهشی» (Gradient Descent) استفاده می‌کند.

الگوریتم یادگیری پس انتشار (BackPropagation) در شبکه های عصبی مصنوعی چند لایه

الگوریتم پس انتشار در شبکه عصبی مصنوعی به اطلاعات اجازه می‌دهد تا از تابع هزینه لایه خروجی به سمت لایه‌های پیشین شبکه عصبی انتشار پیدا کنند (پس انتشار اطلاعات) و از این طریق، گرادیان‌ها محاسبه شوند. بنابراین، در الگوریتم پس انتشار، از نود پایانی در جهت معکوس «ترتیب توپولوژیکی» (Topological Order) شبکه عصبی، پیمایش انجام می‌شود تا مشتق مقدار خروجی نود پایانی، نسبت به هرکدام از نودهای لایه پیشین (و مشتق مقدار خروجی نود آخرین لایه نهان، نسبت به هرکدام از نودهای لایه‌های نهان پیشین و همینطور الی آخر) محاسبه شود.

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

dAL=ALYAL(1AL)d A ^ { L } = \frac { A ^ { L } - Y } { A ^ { L } ( 1 - A ^ { L } ) }

dZL=ALYd Z ^ { L } ={ A ^ { L } - Y }

dWl=1mdZlAl1Td W ^ { l }= \frac { 1 } { m }d Z^{ l } A ^ { l - 1 ^ { T } }

dbl=1mi(dZl)d b ^ { l }= \frac { 1 } { m } \Large { \sum } _ i ( d Z ^ { l } )

dAl1=WiTdZld A ^ { l-1 }= W^{i^{T}} d Z ^ { l }

dZl=dAlgl(Zl)d Z ^ { l }= d A ^ { l } \star g ^ { ' l } ( Z ^ { l } )

از آنجایی که blb^{l} همیشه یک بردار است، جمع ماتریسی در راستای سطرهای ماتریس انجام می‌شود (زیرا، هر ستون یک نمونه را نمایش می‌دهد).

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

مجموعه داده‌ای که برای این کاربرد مورد استفاده قرار گرفته است از 209 تصویر تشکیل شده است. دقت پیکسلی هر تصویر 64x64 است و در فضای رنگی RGB قرار دارد. هدف این کاربرد، پیاده‌سازی شبکه عصبی مصنوعی برای دسته‌بندی دسته‌بندی تصاویر در دو کلاس گربه و غیر گربه است.

بنابراین، yi{0,1}y ^ { i } \in \left \{ 0 , 1 \right\}.

  • در ابتدا، تصاویر در سیستم بارگیری می‌شوند.
  • سپس، ماتریس ورودی به گونه‌ای تغییر شکل داده می‌شود که هر ستون، یک نمونه را نشان دهد. از آنجایی که ابعاد هر تصویر برابر با 64x64x3 است، بنابراین هر کدام از تصاویر، 12288 ویژگی خواهند داشت. بنابراین، اندازه ماتریس ورودی برابر با 12288x209 خواهد بود.
  • داده‌ها «استانداردسازی» (Standardize) می‌شوند تا مقادیر گرادیان‌های محاسبه شده از کنترل خارج نشوند. چنین کاری، سبب یکسان شدن «برد» (Range) مقادیر نودهای لایه نهان می‌شود. در این مطلب، برای استاندارد‌سازی تصاویر، مقادیر تمامی پیکسل‌ها بر عدد 255 تقسیم می‌شوند. با این حال، توصیه می‌شود که داده‌ها به گونه‌ای استاندارد‌سازی شوند که «میانگین» (Mean) آماری آن‌ها برابر با صفر و «انحراف معیار» (Standard Deviation) آن‌ها برابر با 1 باشد.

برای دانلود داده‌های آموزشی و تست این کاربرد، به لینک [+] زیر مراجعه شود.

خروجی:

Original dimensions:
--------------------
Training: (209, 64, 64, 3), (209,)
Test: (50, 64, 64, 3), (50,)

New dimensions:
---------------
Training: (12288, 209), (1, 209)
Test: (12288, 50), (1, 50)

شبکه های عصبی مصنوعی (Artificial Neural Networks)

پس از این مرحله، مجموعه داده لازم برای «آموزش» (Training) و «تست» (Test) شبکه عصبی آماده خواهد شد. در ابتدا، تابع تولید «مدل چند لایه» (Multi-Layer Model) برای پیاده‌سازی الگوریتم یادگیری مبتنی بر روش گرادیان نمایش داده می‌شود. برای تولید این تابع، از تعداد تکرار (3000) و نرخ یادگیری (0٫۰۱) مشخص استفاده می‌شود.

در مرحله بعد، دو نسخه از شبکه عصبی پیاده‌سازی شده آموزش داده می‌شود؛ در نسخه اول، از تابع ReLU و در نسخه دوم، از تابع تانژانت هذلولوی یا هیپربولیک، به عنوان تابع فعال‌سازی لایه‌های نهان استفاده شده است. سپس، از دو مدل شبکه عصبی آموزش دیده، برای دسته‌بندی تصاویر تست و محاسبه نرخ دقت در مرحله تست استفاده می‌شود. با استفاده از نتایج دقت دو مدل آموزش دیده، بهترین تابع فعال‌سازی برای آموزش شبکه عصبی مشخص می‌شود.

The cost after 100 iterations is: 0.6556
The cost after 500 iterations is: 0.6440
The cost after 1000 iterations is: 0.6439
The cost after 1500 iterations is: 0.6437
The cost after 2000 iterations is: 0.6124
The cost after 2500 iterations is: 0.3387
The cost after 3000 iterations is: 0.1040

'The accuracy rate is: 68.00%.'

شبکه های عصبی مصنوعی (Artificial Neural Networks)

شبکه های عصبی مصنوعی (Artificial Neural Networks)

جمع‌بندی

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

برخی از مهم‌ترین نکات حاصل از این مطلب عبارتند از:

  1. حتی اگر شبکه های عصبی مصنوعی قادر به مدل‌سازی و نمایش هر نوع تابعی باشند، به دو دلیل مهم، ممکن است قادر به یادگیری بهینه آن نباشند:
    • ممکن است الگوریتم بهینه‌سازی قادر به پیدا کردن بهترین مقادیر برای پارامترهای تابع نباشد؛ یعنی، در کمینه محلی قرار بگیرد.
    • به دلیل «بیش‌برازش» (Overfitting)، الگوریتم یادگیری ممکن است شکل تابعی متفاوت از شکل تابعی مورد نظر را پیدا کند.
  2. اگرچه شبکه‌های عصبی به ندرت به جواب بهینه سراسری همگرا می‌شوند و معمولا در کمینه سراسری قرار می‌گیرند، با این حال، هزینه‌ها (محاسباتی) را به شدت کاهش می‌دهند و مدل‌های بسیار پیچیده و با دقت بالا برای حل مسائل ارائه می‌دهند.
  3. شبکه عصبی استفاده شده در این مطلب، شبکه عصبی استاندارد «کاملا مصل» (Fully Connected) است. دو نوع شبکه عصبی متداول دیگر عبارتند از:
    • «شبکه‌های عصبی پیچشی» (Convolutional Neural Network): در این نوع شبکه عصبی، نودهای شبکه کاملا به هم متصل نیستند و بیشتر برای کاربردهایی نظیر بازشناسی تصویر مورد استفاده قرار می‌گیرند.
    • «شبکه‌های عصبی بازگشتی» (Recurrent Neural Network): در این نوع شبکه عصبی، وجود «ارتباطات بازخوردی» (Feedback Connection) در سیستم سبب می‌شود تا خروجی مدل، دوباره وارد همان مدل شود. از این دسته از روش‌ها، بیشتر برای «مدل‌سازی ترتیبی» (Sequential Modelling) استفاده می‌شود.
  4. شبکه‌های عصبی استاندارد کاملا متصل، حافظه‌ای از اتفاقات رخ داده در مراحل قبل ندارند. همچنین، هیچ‌گونه اطلاعاتی در رابطه با خروجی ندارند.
  5. تعدادی از «اَبَرپارامترهای» شبکه عصبی را می‌توان با استفاده از «اعتبارسنجی متقابل» (Cross-Validation) بهینه‌سازی کرد تا بهترین عملکرد ممکن توسط شبکه عصبی حاصل شود:
    • نرخ یادگیری: اندازه گام‌های به روز رسانی پارامترهای شبکه عصبی را مشخص می‌کند. مقدار کم برای نرخ یادگیری، سبب همگرایی آهسته و افزایش بار محاسباتی سیستم می‌شود. مقدار زیاد برای نرخ یادگیری، ممکن است سبب عدم همگرایی مدل به جواب (یا تقریب مناسبی از جواب) بهینه شود.
    • تعداد لایه‌های نهان (عمق): تعداد بیشتر لایه‌های نهان، سبب عملکرد بهینه سیستم یادگیری می‌شود ولی هزینه محاسباتی را افزایش می‌دهد.
    • تعداد نودهای در هر لایه (پهنا): تحقیقات نشان داده است که تعداد زیاد نودهای در لایه‌های مختلف، منجر به بهبود عملکرد سیستم نخواهد شد.
    • تابع فعال‌سازی: انتخاب تابع فعال‌سازی مناسب برای یک کاربرد خاص، یک فرایند آزمون و خطا است و بستگی زیادی به نوع کاربرد دارد.
    • تعداد تکرارهای الگوریتم یادگیری برای رسید به جواب.
  6. استانداردسازی داده‌ها: به توابع فعال‌سازی کمک می‌کند تا خروجی‌های مشابهی (از لحاظ برد مقادیر) داشته باشند. همچنین، به سیستم در کنترل مقادیر گرادیان‌های محاسبه شده کمک می‌کند.

شبکه های عصبی مصنوعی (Artificial Neural Networks)

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Towards Data ScienceGitHub
دانلود PDF مقاله
۲ دیدگاه برای «کدنویسی شبکه های عصبی مصنوعی چند لایه در پایتون – راهنمای کامل»

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

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

نظر شما چیست؟

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