تشخیص اعداد فارسی با استفاده از شبکه عصبی مصنوعی (هاپفیلد)
جمعه, ۲۲ آذر ۱۳۹۲، ۱۲:۳۲ ق.ظ
در پست های قبلی این کار را با شبکه معمولی پیش خور و همینگ انجام دادیم. با روش هاپفیلد نتایج بهتری کسب خواهیم کرد.
استفاده از nntool برای تعریف شبکه:
شبکه هاپفیلد مورد نظر را با دستور «nntool» و انتخاب نوع شبکه هاپفیلد ایجاد میکنیم. برای ایجاد این نوع شبکه برنامه تنها از کاربر ماتریس اهداف را میخواهد. ماتریس اهداف را اینگونه تعریف میکنیم:
این ماتریس شامل تمامی ماتریس های ورودی به صورت () است که با حالت ترانهاده وارد شده اند. در واقع ماتریس هدف به صورت زیر است:
فرض اولیه «nom» با پیش بینی هیچکدام از اعداد اصلی است. 10 الگوی اصلی ایده آل را وارد ماتریس هدف کرده و با این ماتریس هدف شبکه را در خط 17 می سازیم. روند ارزیابی یا شبیه سازی شبکه با افزایش پله های تکرار تا زمانی که یکی از الگوها پیش بینی شوند تکرار خواهد شد. در این روند به طور دائم ماتریس خروجی که از دل خروجی سلولی شبکه بدست می آید با الگو ها مقایسه می شود. زمانی که مقدار «nom» عددی غیر از 10 شد این حلقه متوقف میشود.
آزمایش شبکه:
شبکه را با یک داده و یا الگوی نمونه بررسی میکنیم. این تست با دستور زیر آغاز میشود:
تابع فراخوانی شده و پس از محاسبات مقادیر پیش بینی، ماتریس خروجی و تعداد تکرار نهایی را به خروجی تحویل می دهد. برای عدد 9 نمونه نتایج زیر ارائه شد:
طبق نتایج بالا مشاهده میشود که عدد تشخیص داده شده صحیح است. این نتیجه مطلوب در 16 تکرار حاصل شده است. شبکه نیاز به نمونه ها و الگوهای اصلی بیشتری برای تشخیص صحیح دارد.
شبکه هاپفیلد مورد نظر را با دستور «nntool» و انتخاب نوع شبکه هاپفیلد ایجاد میکنیم. برای ایجاد این نوع شبکه برنامه تنها از کاربر ماتریس اهداف را میخواهد. ماتریس اهداف را اینگونه تعریف میکنیم:
این ماتریس شامل تمامی ماتریس های ورودی به صورت () است که با حالت ترانهاده وارد شده اند. در واقع ماتریس هدف به صورت زیر است:
سپس الگو ها را از نوع (Layer Delay States) وارد میکنیم. هر الگو به صورت طبیعی خودش (ستونی) وارد میشود. شمای نتیجه شبکه ایجاد شده به صورت زیر خواهد بود:
مقدار 25 تعداد ورودی ها است. برای شبیه سازی نیز در همین محیط میتوانیم خروجی ها را دید. اما برای بررسی شبکه این روش مناسب نیست. پس شبکه را با کد نویسی ایجاد می کنیم.
ایجاد شبکه با کد نویسی:
برای ایجاد شبکه، تابع زیر (با نام «hoping») با ورودی آدرس تصویر عدد نمونه و خروجی پیش بینی، خروجی شبکه و تعداد تکرار طی شده در محیط متلب کد نویسی شد؛ البته تمامی صفر ها در ماتریس هدف تبدیل به 1- شدند:
مقدار 25 تعداد ورودی ها است. برای شبیه سازی نیز در همین محیط میتوانیم خروجی ها را دید. اما برای بررسی شبکه این روش مناسب نیست. پس شبکه را با کد نویسی ایجاد می کنیم.
ایجاد شبکه با کد نویسی:
برای ایجاد شبکه، تابع زیر (با نام «hoping») با ورودی آدرس تصویر عدد نمونه و خروجی پیش بینی، خروجی شبکه و تعداد تکرار طی شده در محیط متلب کد نویسی شد؛ البته تمامی صفر ها در ماتریس هدف تبدیل به 1- شدند:
فرض اولیه «nom» با پیش بینی هیچکدام از اعداد اصلی است. 10 الگوی اصلی ایده آل را وارد ماتریس هدف کرده و با این ماتریس هدف شبکه را در خط 17 می سازیم. روند ارزیابی یا شبیه سازی شبکه با افزایش پله های تکرار تا زمانی که یکی از الگوها پیش بینی شوند تکرار خواهد شد. در این روند به طور دائم ماتریس خروجی که از دل خروجی سلولی شبکه بدست می آید با الگو ها مقایسه می شود. زمانی که مقدار «nom» عددی غیر از 10 شد این حلقه متوقف میشود.
آزمایش شبکه:
شبکه را با یک داده و یا الگوی نمونه بررسی میکنیم. این تست با دستور زیر آغاز میشود:
طبق نتایج بالا مشاهده میشود که عدد تشخیص داده شده صحیح است. این نتیجه مطلوب در 16 تکرار حاصل شده است. شبکه نیاز به نمونه ها و الگوهای اصلی بیشتری برای تشخیص صحیح دارد.
۹۲/۰۹/۲۲