تشخیص اعداد فارسی با استفاده از شبکه عصبی مصنوعی (همینگ)
جمعه, ۲۲ آذر ۱۳۹۲، ۱۲:۲۴ ق.ظ
در پست های قبل همین پروژه را با شبکه عصبی معمولی پیش خور انجام دادیم که نتایج آن چنگی به دل نمیزد. در این پست همین کار را با شبکه عصبی همینگ انجام میدیم. دقت کنید که کد این نوع شبکه در متلب نوشته شده است.
طراحی تابع عملیات:
با توجه به نبود الگوی شبکه همینگ در نرم افزار متلب سعی شد روند و الگوریتم این شبکه در بخش کد نویسی متلب به صورت یک فانکشن به شرح زیر ایجاد شود:
طراحی تابع عملیات:
با توجه به نبود الگوی شبکه همینگ در نرم افزار متلب سعی شد روند و الگوریتم این شبکه در بخش کد نویسی متلب به صورت یک فانکشن به شرح زیر ایجاد شود:
تشریح تابع و روند کار آن:
یک تابع با نام «whatnom» با ورودی آدرس تصویر مربوط به عدد نوشته شده نمونه و خروجی تشخیص شبکه در مورد این ورودی، تعداد تکرار انجام شده و ماتریس خروجی آخر ایجاد شد. در خط دوم تصویر توسط تابع «makepic» به داده ستونی تبدیل خواهد شد. این داده برای شبیه سازی شبکه مورد استفاده قرار میگیرد. تابع «makepic» در زیر آورده شده است:
توسط همین تابع الگوهایی را به داده های یک ستونی 25 ردیفه تبدیل می کنیم. همچنین تمامی مولفه های صفر را تبدیل به 1- میکنیم. با این الگوها که ده عدد نوشته شده به صورت ایده آل هستند، شبکه را خواهیم ساخت. مقدار «S» و مقدار «R» به ترتیب تعداد الگوها و تعداد ورودی ها یا همان ردیف ماتریس های الگوها است. ماتریس وزن «W1» با ابعاد 10 در 25 لایه اول شبکه همینگ را در خط 48 بدست می آوریم. ماتریس بایاس ها هم یک ماتریس 10 ردیفی با مقادیر یکسان مولفه R یا همان 25 است. «u1» (یک ماتریس 10 در یک) خروجی لایه اول و ورودی تابع انتقال این لایه است که در خط 50 محاسبه میشود. تابع انتقال این لایه نیز یک تابع همانی است. در واقع ضرورتی در نوشتن خطوط 51 تا 54 نیست. در این مرحله کار در لایه اول شبکه همینگ تمام میشود و «f1» خروجی آن است.
خطوط 55 تا 62 ماتریس 10 در 10 وزن لایه دوم شبکه همینگ (W2) را تولید میکند. همچنین ماتریس وزن لایه سوم (W3) نیز که ترانهاده ماتریس وزن لایه اول است در خط 63 محاسبه شد. در خط 65، پیش بینی اولیه شبکه را در متغیر «nom» ده فرض میکنیم (یعنی هیچکدام از اعداد 0 تا 9).
مقدار «u2» یا همان خروجی لایه دوم قبل از ورود به تابع انتقال خطی مثبت (خط 39) در خط 72 محاسبه میشود. مقدار اولیه «f2» همان مقدار «f1» است (خط 64). بعد از محاسبه «f2» این مقدار به لایه سوم فرستاده می شود تا الگو ساخته و در نتیجه شناسایی گردد.
مقدار «u3» و «f3» در خطوط 77 تا 84 محاسبه میشوند. تابع انتقال در لایه سوم تابع «Hard Limiter» دو طرفه است (خط 83). خطوط 85 تا 105 نیز مقدار خروجی را با الگوها تطبیق داده و بعد از مقایسه خروجی «nom» را اعلام میکند. در آخر زمانی که ماتریس «u3» نهایی با ماتریس «u3» محاسبه شده در مرحله قبل مساوی شد حلقه متوقف میشود و نتیجه اعلام می گردد.
آزمایش و شبیه سازی شبکه:
به منظور شبیه سازی شبکه مثال زیر را پی میگیریم: یک نمونه عدد 7 را با دستور زیر در محیط متلب به شبکه طراحی شده وارد میکنیم. خروجی تابع ترتیب زیر ظاهر میشود:
تابع بعد از طی 8 مرحله تکرار به نتیجه و آن هم نتیجه صحیح رسید. اعداد دیگر را میتوانید به همین راحتی امتحان کنید و نتیجه را ببینید. میتونید برای تمرین و مشاهده کد نمونه به اینجا هم مراجعه کنید.
یک تابع با نام «whatnom» با ورودی آدرس تصویر مربوط به عدد نوشته شده نمونه و خروجی تشخیص شبکه در مورد این ورودی، تعداد تکرار انجام شده و ماتریس خروجی آخر ایجاد شد. در خط دوم تصویر توسط تابع «makepic» به داده ستونی تبدیل خواهد شد. این داده برای شبیه سازی شبکه مورد استفاده قرار میگیرد. تابع «makepic» در زیر آورده شده است:
توسط همین تابع الگوهایی را به داده های یک ستونی 25 ردیفه تبدیل می کنیم. همچنین تمامی مولفه های صفر را تبدیل به 1- میکنیم. با این الگوها که ده عدد نوشته شده به صورت ایده آل هستند، شبکه را خواهیم ساخت. مقدار «S» و مقدار «R» به ترتیب تعداد الگوها و تعداد ورودی ها یا همان ردیف ماتریس های الگوها است. ماتریس وزن «W1» با ابعاد 10 در 25 لایه اول شبکه همینگ را در خط 48 بدست می آوریم. ماتریس بایاس ها هم یک ماتریس 10 ردیفی با مقادیر یکسان مولفه R یا همان 25 است. «u1» (یک ماتریس 10 در یک) خروجی لایه اول و ورودی تابع انتقال این لایه است که در خط 50 محاسبه میشود. تابع انتقال این لایه نیز یک تابع همانی است. در واقع ضرورتی در نوشتن خطوط 51 تا 54 نیست. در این مرحله کار در لایه اول شبکه همینگ تمام میشود و «f1» خروجی آن است.
خطوط 55 تا 62 ماتریس 10 در 10 وزن لایه دوم شبکه همینگ (W2) را تولید میکند. همچنین ماتریس وزن لایه سوم (W3) نیز که ترانهاده ماتریس وزن لایه اول است در خط 63 محاسبه شد. در خط 65، پیش بینی اولیه شبکه را در متغیر «nom» ده فرض میکنیم (یعنی هیچکدام از اعداد 0 تا 9).
مقدار «u2» یا همان خروجی لایه دوم قبل از ورود به تابع انتقال خطی مثبت (خط 39) در خط 72 محاسبه میشود. مقدار اولیه «f2» همان مقدار «f1» است (خط 64). بعد از محاسبه «f2» این مقدار به لایه سوم فرستاده می شود تا الگو ساخته و در نتیجه شناسایی گردد.
مقدار «u3» و «f3» در خطوط 77 تا 84 محاسبه میشوند. تابع انتقال در لایه سوم تابع «Hard Limiter» دو طرفه است (خط 83). خطوط 85 تا 105 نیز مقدار خروجی را با الگوها تطبیق داده و بعد از مقایسه خروجی «nom» را اعلام میکند. در آخر زمانی که ماتریس «u3» نهایی با ماتریس «u3» محاسبه شده در مرحله قبل مساوی شد حلقه متوقف میشود و نتیجه اعلام می گردد.
آزمایش و شبیه سازی شبکه:
به منظور شبیه سازی شبکه مثال زیر را پی میگیریم: یک نمونه عدد 7 را با دستور زیر در محیط متلب به شبکه طراحی شده وارد میکنیم. خروجی تابع ترتیب زیر ظاهر میشود:
تابع بعد از طی 8 مرحله تکرار به نتیجه و آن هم نتیجه صحیح رسید. اعداد دیگر را میتوانید به همین راحتی امتحان کنید و نتیجه را ببینید. میتونید برای تمرین و مشاهده کد نمونه به اینجا هم مراجعه کنید.
۹۲/۰۹/۲۲