شبكه الPerceptron تعد من أقدم وأسهل أنواع الشبكات العصبيه ، وهي نوع مبسط من الFeed-Forward Neural Network حيث هناك نوع منها يحتوي على طبقه واحده Single Layer والأخر يحتوي على أكثر من طبقه Multi-Perceptron Layer واختصارا MPL . وبشكل عام مهمه هذا النموذج هي في التصنيف Classification .
موضوعنا اليوم حول النموذج البسيط Single Layer وباذن الله نتحدث حول MPL المره القادمه ،، وشبكه الSingle Layer Perceptron تسمى عاده linear classifier بمعنى أن هذه الشبكه تحل المشاكل التي يمكن فصلها بشكل خطي linearly separable ، انظر للصوره التاليه وستجد أن الخط الأخضر قد فصل بين اللون الأزرق والأحمر ،، وهذه الشبكه تستطيع حل المشاكل مثل هذه .
سنقوم في موضوعنا الليله بكتابه برنامج باستخدام الشبكه Perceptron نقوم باعطائه أي بعد في الصوره السابقه وتقوم الشبكه بالرد اما أن البعد في المنطقه التي في النقاط باللون الأزرق أو الأخرى باللون الأحمر ،، نبدأ على بركه الله،
أولا الشبكه Single Layer Perceptron سوف تتكون من مدخلين يمثلان البعدين اللذان سندخلانه ، والمخرج سوف يكون اما 1 (أزرق) أو -1 (أحمر) ، وبهذا يكون شكل الشبكه كالتالي :
سنستخدم Delta Rule لتعديل الأوزان والتي ستكون في البدايه 0.0 ، أيضا الActivation function سوف نستخدم bipolar threshold function تعطي 1 للون الأزرق ، و-1 للون الأحمر ، أيضا الLarning rate سوف يكون بمقدار 0.1 ويمكن تغييره في البرنامج ، بالاضافه الى الThreshold سوف يكون بقيمه 0.1 ويمكن تغيير أيضا ،
في البدايه سوف نقدم 30 مثال (نقطه) للشبكه بالاضافه الى الناتج من كل نقطه target output ، بعد أن تتدرب الشبكه على ذلك (وسوف تستغرق عدد محدد من الepoch الدورات) ، سنقدم عده أمثله جديده لكي نختبر البرنامج ولنرى مدى كفائه الشبكه ،،
البرنامج بسيط ويستخدم مكتبه الMatrix التي سبق وان صممناها في الHopfeild ، اترككم مع الكود :
// Perceptron.cpp #include "Perceptron.h" #include <iostream> using namespace std ; #define NUM 30 // 30 sample example #define SIZE 2 // two input void printData (double i, double j, int output); int main (int argc,char* argv[]) { // traning data double input[NUM][SIZE] = { { 0.72 , 0.82 }, { 0.91 , -0.69 }, { 0.46 , 0.80 }, { 0.03 , 0.93 }, { 0.12 , 0.25 }, { 0.96 , 0.47 }, { 0.79 , -0.75 }, { 0.46 , 0.98 }, { 0.66 , 0.24 }, { 0.72 , -0.15 }, { 0.35 , 0.01 }, { -0.16, 0.84 }, { -0.04, 0.68 }, { -0.11, 0.10 }, { 0.31 , -0.96 }, { 0.00 , -0.26 }, { -0.43, -0.65 }, { 0.57 , -0.97 }, { -0.47, -0.03 }, { -0.72, -0.64 }, { -0.57, 0.15 }, { -0.25, -0.43 }, { 0.47 , -0.88 }, { -0.12, -0.90 }, { -0.58, 0.62 }, { -0.48, 0.05 }, { -0.79, -0.92 }, { -0.42, -0.09 }, { -0.76, 0.65 }, { -0.77, -0.76 } }; // target output int output[NUM] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1, 1, 1, 1 } ; // perceptron with (input,output,weight,TH,LR) Perceptron perceptron(input,output,NUM); // print data cout << "Traning Data Input : " << endl; cout << perceptron.getInput() << endl; cout << "Target Data Output : " << endl; cout << perceptron.getOutput() << endl; cout << "Weight : " << endl; cout << perceptron.getWeight() << endl; system("pause"); cout << endl << endl; // train ANN perceptron.train(); // test ANN from number (-1,-1) to (1,1) cout << "input 1 , input2 > output " << endl; cout << "----------------------------" << endl << endl; for (double i=-1 ; i<=1 ; i +=0.5) { for (double j=-1 ; j<=1 ; j +=0.5) { int output = perceptron.classify(i,j); printData(i,j,output); } } printData(5,5,perceptron.classify(5,5)); // test (5,5) printData(-15,5,perceptron.classify(-15,5)); // test (-15,5) cout << endl << endl; cout << "Weight : " << endl; cout << perceptron.getWeight() << endl; cout << "Number of iteration : " << endl; cout << perceptron.getIteration() << endl; return (0); } void printData (double i, double j, int output) { cout << setw(6) << setfill(' ') << i << setw(10) << setfill(' ') << j << setw(10) << setfill(' ') ; if ( output == 1 ) cout << "Blue" ; else cout << "Red" ; cout << endl; }
لنقم الان بتشغيل البرنامج ، وسنرى الجزء الأول من المخرج وهي البيانات التي قدمناها كأمثله للتدريب بالاضافه الى النتيجه المقابله لها ، وسوف يعرض الأوزان الأبتدائيه ،،
بعد الضغط على enter تبدأ عمليه التدريب ، الى أن تنتهي وسيخرج الناتج كما توضح الصوره التاليه ،، (يمكن ادخال جمله طباعه cout لطباعه كل من الخطأ والدوره الحاليه والوزن الجديد داخل داله التدريب حتى يسهل تتبع البرنامج) .
راجع الصوره الأولى الخاصه بالاحداثيات لكي تتأكد من النتيجه ،،
هناك بعض الأحيان مشاكل غير قابله للفصل الخطي مثل XOR ، انظر للصوره التاليه لكي توضح لك :
في هذه النوع من المشاكل يجب أن نستخدم أكثر من طبقه في شبكه وهو نوع MPL وباذن الله نتناوله المره المقدمه ،،
في هذا الرابط المثال كاملاً (حمله من هنا) ،،
محتوى رائع والجهد المبذول به واضح، أتمنى أن تبقوا على هذه السوية في تقديم معلومة مفيدة ومتكاملة من الناحية النظرية والعملية