ایجاد شبکه های عصبی در نرم افزار متلب
به طور كلي در نرمافزار MATLAB به سه روش ميتوان شبكههاي عصبي را ايجاد كرد:
1. كدنويسي
2. استفاده از سيستمهاي بلوكي(Simulink)
3. استفاده از محيط گرافيكي(GUI)
در اين نوشتار قصد دارم نحوهي استفاده از GUI در جعبهابزار شبكه عصبي را به دوستان معرفي كنم البته به دوستان توصيه ميكنم كه ابتدا با كدنويسي آشنا شوند زيرا ممكن است درجايي مجبور به نوشتن كد باشند مگر كساني كه شبكه عصبي، درس تخصصي آنها نبوده و فقط براي انجام قسمتي از پروژهشان ميخواهند از شبكههاي عصبي استفاده كنند كه استفاده از GUI در اين مورد بسيار ساده و سريع است.
براي شروع nntool را در خط فرمان تايپ و اينتر كنيد و يا از مسير Start >> Toolboxes >> Neural Network >> Neural Network Tool استفاده كنيد پنجرهاي مانند شكل زير مشاهده ميكنيد:
براي ايجاد يك شبكه جديد، روي دگمه New كليك كنيد همانطور كه مشاهده ميشود، پنجرهاي باز ميشود كه ميتوانيد در آن پارامترهاي شبكهي مورد نظرتان را وارد كنيد:
در تب Network شما ميتوانيد تنظيمات مربوط به شبكه عصبي مورد نظرتان را وارد كنيد و در زبانه دوم يعني Data شما دادههاي خود را وارد ميكنيد. حالا براي مثال اول ميخواهيم با يك تك پرسپترون، گيت NAND دو ورودي را پيادهسازي كنيم ابتدا نام شبكه مورد نظر را در قسمت Name وارد كنيد من نام NAND را وارد ميكنم سپس در قسمت Network Type نوع شبكه را Perceptron انتخاب كنيد پس از آن به تب Data رفته و در قسمت Name نام p و در قسمت Value مقدار [1 0 1 0;1 1 0 0] و در Data Type حالت Inputs را انتخاب كرده و به روي Create كليك كنيد ديالوگي مبني بر ذخيره ديتا مشاهده ميكنيد آن را Ok كنيد سپس براي ذخيرهي دادههاي تارگت مشابه حالت قبل عمل كنيد يعني در قسمت Name نام t و در قسمت Value مقدار [0 1 1 1] و در Data Type حالت Targets را انتخاب كرده و به روي Create كليك كنيد ديالوگ مشاهده شده را Ok كنيد. به تب Network بازگشته و دادههاي ورودي و تارگت را از منوي مقابلشان انتخاب كنيد براي ديدن ساختار شبكه، بر دگمه View كليك كنيد بصورت زير:
همانطور كه ميبينيد از تابع محدود كننده سخت نامتقارن استفاده كردهايم تا خروجيهاي ما صفر يا يك شوند حالا براي ايجاد شبكه، Create را كليك، و ديالوگ پس از آن را Ok كنيد به پنجره اصلي بازگشته و در قسمت Networks به روي NAND كليك كرده و Open را بزنيد در پنجره باز شده به تب Train رفته و مقادير ورودي و تارگت را وارد كرده و براي شروع آموزش Train Network را بفشاريد همانطور كه مشاهده ميكنيد به پرفورمانس صفر رسيدهايم(اتفاقي كه در هيچكدام از مسائل واقعي كه ما با آن سروكار داريم، هرگز رخ نخواهد داد!) كه دليلش را هم احتمالا ميدانيد حال به پنجره اصلي بازگشته و مقادير خروجي و خطا را به ازاي دادههاي آموزشي مشاهده كنيد كه البته از پرفورمانس صفر ميتوان حدس زد كه چه مقاديري به دست آمده است.
اكنون اگر بوسيلهي همين روش تابع XOR را پيادهسازي كنيد نتايج وحشتناكي خواهيد گرفت.
براي مثال دوم ميخواهيم تابع سينوس را بوسيلهي يك شبكه عصبي MLP ، تقريب بزنيم براي اين منظور در پنجره مديريت شبكه و ديتا، New را كليك كرده و مانند شكل زير عمل كنيد:
شبكه را دو لايه قرار دادهايم كه در لايه اول ده نرون با تابع تبديل تانژانت سيگموئيد و لايه دوم كه همان لايه خروجي است را تابع تبديل خطي دادهايم(نرونهاي لايه خروجي برابر تعداد خروجيهاي شبكه ميباشد كه در اين مثال برابر يك است.)
البته من يادم رفت كه نحوهي ايجاد دادهها را به شما بگم در اينجا ديگر نميتوانيد از روش قبل براي ايجاد دادههاي خود استفاده كنيد و بايد ديتا را يا از يك فايل mat بگيريد و يا از فضاي كاري متلب. دستورات زير را در خط فرمان تايپ و اينتر كنيد:
;p=0:0.1:4*pi
;(t=sin(p
به پنجرهي اصلي بازگشته و Import را كليك كنيد سپس دادههاي p و t را به ترتيب عنوان دادههاي ورودي و تارگت، Import كرده و سپس Close كنيد.
حال به پنجرهي تنظيمات بازگشته و دادههاي ورودي و تارگت را وارد كرده و شبكه را ايجاد كنيد. شبكهاي را كه با نام Sin ذخيره كردهايد، باز كنيد و به تب Train برويد و پس از وارد كردن دادههاي ورودي و تارگت، به تب Training Parameters برويد همانطور كه ملاحظه ميكنيد در اينجا ميتوانيد پارامترهاي زيادي را تغيير دهيد مثلا ممكن است در مسالهاي خاص، پرفورمانسي برابر 0.001 كافي باشد كه ميتوانيد در قسمت goal آن عدد را وارد كنيد و نيز تنظيمات ديگري از جمله زمان، تعداد مراحل آموزش و ...
مقادير را پيشفرض قرار داده و شبكه را آموزش دهيد:
اگر به مقاديري غير از آنچه در بالا آمده، رسيدهايد، تعجب نكنيد.
در تب View/Edit Weights ميتوانيد تمام وزنها و باياسها را مشاهده كنيد به پنجرهي اصلي بازگرديد و Export را كليك كرده و شبكه و نيز دادههاي خروجي و خطا را به فضاي كاري متلب انتقال دهيد و كدهاي زير را اجرا كنيد:
(subplot(2,1,1
;(y1=sim(Sin,p
('plot(p,t,p,y1,'m
;([xlim([0 4*pi]);ylim([-1 1
;('(title('Network Output (Training Data
(subplot(2,1,2
;x=0:0.001:4*pi
;(y2=sim(Sin,x
('plot(x,sin(x),x,y2,'m
;([xlim([0 4*pi]);ylim([-1 1
;('(title('Network Output (Test Data
همانطوري كه مشاهده ميشود شبكه با ده نرون به خوبي آموزش ديده و براي دادههاي تست نيز خروجي مناسبي داريم.
(توجه كنيد كه در شكل، منحنيهاي خروجي و تارگت روي هم افتادهاند)
نكته: توجه كنيد كه تابع سينوس يكي از سادهترين توابع است و آن را ميتوانيد با تعداد نرونهاي كمتري(حتي دو سه نرون) با تقريب نسبتا خوبي پيادهسازي كنيد. درواقع بسته به خودتان است كه چه ميزان دقت مورد نياز شماست. يكي از توابع سخت براي پيادهسازي، تابع مربعي ميباشد كه دليل آن تغييرات شديد در لبههاي بالارونده و پائينروندهي آن است به عبارتي ديگر اگر شما ميخواهيد دو تابع سينوسي و مربعي را با دقت يكساني تقريب بزنيد، شما مجبور هستيد تا شبكهي بزرگتري را براي تابع مربعي درنظر بگيريد اين تابع را خودتان پيادهسازي كنيد تا درك بهتري از شبكه عصبي داشته باشيد.