وصف موجز
مع التطور السريع للإنترنت ، أصبح A (AI) B (BigData) C (Cloud) هو اتجاه التطوير الأساسي في الوقت الحاضر. إذا تم الجمع بين الثلاثة بعمق ، فإن الذكاء الاصطناعي هو الجزء الأكثر أهمية منه. لذلك إذا كان يجب على الجميع تعلم البرمجة في المجتمع المستقبلي ، ثم بالنسبة للمبرمجين ، فإن الذكاء الاصطناعي هو التكنولوجيا التي يجب أن يتقنها (تطوير التكنولوجيا سريع حقًا).
تقدم هذه المقالة وتستخدم Java لتنفيذ أبسط شبكة Perceptron ، دون أن تتشابك مع اشتقاق الصيغة ، بهدف تزويدك بأفكار لتعلم الشبكات العصبية والفهم الخام للشبكات العصبية.
تحليل نموذج شبكة Perceptron
انظر أولاً إلى الصورة
إذا كنت مهتمًا قليلاً بالشبكات العصبية ، فيجب أن تكون على دراية بهذه الصورة. هذه الصورة مخطط هيكلي للخلايا العصبية
تمثل x1 ~ xm الإدخال ، ويمثل W1 ~ WM الوزن التشابكي ، ويمثل عقدة التجميع ، وتمثل وظيفة التنشيط وظيفة التنشيط ، ثم إخراج النتيجة. العملية المحددة هي
عندما تتلقى الخلايا العصبية المدخلات ، سيتم ضرب كل إدخال بالوزن على مسارها النسبي. عند الوصول إلى عقدة التلخيص ، يتم ضبط نتيجة العقدة الملخص على z:
z = x1 * w1 + x2 * w2 + x3 * w3 + ...... + xm * wm
ثم مرر z في وظيفة التنشيط (هنا نسمي وظيفة التنشيط f) للتعرف على الأنماط الثنائية:
إذا كان f (x)> e ، y = 1else y = -1e هو العتبة y هي نتيجة التصنيف
يمكن أن نرى هنا أنه إذا كانت قيمة f (x) أكبر من العتبة ، يتم الحصول على التصنيف y = 1 ، والعكس y = -1
ملاحظة: بالمقارنة مع الاستجابة المشار إليها من خلال تحفيز الخلايا العصبية البيولوجية ، إذا كان التحفيز ضمن نطاق مقبول ، فإن الخلايا العصبية ستمنع التحفيز (y = -1) ، وإذا تجاوز النطاق ، فسيكون متحمسًا (y = 1) ، وماء هذا النطاق هو العتبة (E)
يذاكر
وجدنا أنه إذا تم إصلاح الوزن والعتبة ، فلن يكون لهذه الشبكة العصبية معنى. لذلك ، قدمنا مفهوم التعلم والسماح للشبكة العصبية بتعديل الوزن والعتبة من خلال التعلم ، بحيث يمكن تصحيح دقة التعرف على الأنماط ديناميكيًا. هذا هو جوهر التعلم الآلي.
فكيف تتعلم؟ قبل استخدامه ، نحتاج إلى توفير مجموعة من بيانات العينة إلى هذه الشبكة (والتي يتم أخذها هنا للتعلم مع وضع المعلم) ، تتضمن بيانات العينة بيانات الإدخال X ونتيجة التعريف الصحيحة Y '.
عندما نقوم بإدخال بيانات التدريب X والحصول على التعرف على الأنماط ، إذا كان Y! = y '، سيتم تعديل وزن وعتبة هذه الشبكة. يرجى الرجوع إلى صيغة التعديل. μ يمثل معدل التعلم (معدل التصحيح) ، ويمثل التحديث الحاجة إلى تصحيح:
تحديث = μ * (yi - y ') تحديث = (f (x) - y') mς wi += update * xii = 1e += update
عندما تكون نتيجة تصنيف Perceptron مساوية للتصنيف الصحيح ، تحديث = 0 ، ولا يتم ضبط الشبكة ؛ إذا لم يكن مساويًا للتصنيف الصحيح ، فسيتم ضبط جميع الأوزان (W) والعتبات (E)
ما ورد أعلاه هو أبسط عملية تعليمية للبيئة التي قدمتها:
أدخل البيانات -> ملخص للحصول على z-> انتظر من خلال وظيفة التنشيط لانتظار نتائج التصنيف -> نتائج التصنيف لا تتطابق مع النتائج الصحيحة ، اضبط الشبكة
دعونا ننفذ هذه الشبكة العصبية البسيطة
تنفيذ رمز Java
ما قمت بتطبيقه هنا هو تعلم التعرف على الإيجابية والسلبية للأعداد الصحيحة من خلال الشبكات العصبية. أولاً ، حدد فصلًا يحدد أولاً إدراكي.
/*** تم إنشاؤه بواسطة Cimzzz في 12/2/17. **/public class perceptron {/*** معدل التعلم*/تعويم النهائي الخاص ؛ / *** عدد أوقات التعلم*/ Private Final Int StudyCount ؛ / *** عتبة*/ تعويم خاص ه ؛ / *** الوزن* لأنه مطلوب فقط إدخال واحد لتحديد عدد صحيح موجب وسلبي ، هناك وزن واحد فقط هنا ، ويمكن ضبط مدخلات متعددة على صفيف*/ تعويم خاص ث ؛ / *** المعدل الصحيح لكل تعلم*/ تعويم خاص [] صحيح ؛ /// ** * يهيئ مُنشئ معدل التعلم ، ويتم تهيئة عدد أوقات التعلم ، والوزن ، والعتبة إلى 0 * @param معدل التعلم (نطاق القيمة 0 <التعلم <1) * param studycount عدد أوقات التعلم */ perceptron العامة (تعويم التعلم ، int stuductcount) {this.learnrate = this.studyCount = studyCount ؛ this.e = 0 ؛ this.w = 0 ؛ this.correctrate = تعويم جديد [studyCount] ؛ } / *** وظيفة التعلم ، فإن العينات هي صفيف ثنائي الأبعاد يحتوي على بيانات الإدخال ونتائج التصنيف ،* العينات [] [0] تمثل بيانات الإدخال* عينات [] [1] نتائج التصنيف الصحيحة* param عينات تدريب البيانات* / fit public void (int [] samples) {int samplelength. لـ (int i = 0 ؛ i <studyCount ؛ i ++) {int errorcount = 0 ؛ لـ (int [] عينة: العينات) {float update = learnrate * (sample [1] -predict (sample [0])) ؛ // تحديث الوزن والعتبة W += تحديث * عينة [0] ؛ E += تحديث ؛ // احسب رقم الخطأ إذا (تحديث! = 0) errorcount ++ ؛ } // حساب صحة هذا التعلم بشكل صحيح [i] = 1 - errorcount * 1.0f /samplelength ؛ }} / *** وظيفة SUM ، محاكاة بيانات إدخال تشغيل Node Secution* الوزن* param num بيانات الإدخال* return sum result z* / private float sum (int num) {return num* w + e ؛ } / *** قم بتفعيل الوظيفة ، القاضي عن طريق تلخيص النتيجة z و Threshold E* param num data* return regustification result* / public int predict (int num) {return sum (num)> = 0؟ 1: -1 ؛ }/*** دقة الطباعة*/public void printcorrectrate () {for (int i = 0 ؛ i <studyCount ؛ i ++) system.out.printf ("نتيجة التعلم عند ٪ d-> ٪. }}ثم اكتب الوظيفة التي تنشئ بيانات التدريب
/*** إنشاء بيانات التدريب* بيانات التدريب RETURN*/private static int [] [] GenStudyData () {// هنا نأخذ عدد صحيح بين -100 و 100 ، وإذا كان أكبر من 0 ، قم بتعيينه على الوضع y = 1 ، وإلا لـ (int i = -100 ، j = 0 ؛ i <= 100 ؛ i ++ ، j ++) {data [j] [0] = i ؛ البيانات [J] [1] = i> = 0؟ 1: -1 ؛ } إرجاع البيانات ؛ } /*** إنشاء بيانات التدريب* بيانات التدريب REGRINT* /private static int [] [] GenStudyData2 () {// هنا نأخذ عدد صحيح بين 1 ~ 250 ، وإذا كان أكبر من 125 ، قم بتعيينه على الوضع y = 1 ، وإلا لـ (int i = 1 ، j = 0 ؛ i <= 250 ؛ i ++ ، j ++) {data [j] [0] = i ؛ البيانات [J] [1] = i> = 125؟ 1: -1 ؛ } إرجاع البيانات ؛ }أخيرًا ، الوظيفة الرئيسية
يمكن ضبط الفراغ الثابت العام (سلسلة [] args) {// أوقات التعلم وأوقات التدريب هنا يدويًا وفقًا للوضع perceptron perceptron = New Perceptron (0.4F ، 500) ؛ perceptron.fit (genstudydata ()) ؛ perceptron.printcorrectrate () ؛ system.out.println (perceptron.predict (-1)) ؛ System.out.println (Perceptron.Predict (126)) ؛ }يمكنك اختباره
قيود
هذه الشبكة العصبية Perceptron بسيطة نسبيًا وهي مناسبة للبيانات المقسمة خطيًا ، مثل الأرقام الإيجابية والسلبية في تصنيف رباعي الإحداثيات أحادية البعد ، وتصنيف الإحداثيات ثنائية الأبعاد ؛ لا يمكن تصنيف البيانات التي لا يمكن تصنيفها بشكل صحيح ، مثل العثور على أعداد أولية ، إلخ.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.