مرحبًا ومرحبًا بكم في برنامج Python التعليمي هذا.
حسنًا ، لدينا دروس تعليمية مثيرة للغاية أمامنا.
سنبدأ بإنشاء بنية الشبكة العصبية.
أي أننا سنصنع الشبكة العصبية التي ستكون في قلب الذكاء الاصطناعي لدينا والتي ستعيد الإجراء
للعب في كل مرة.
نرى؟
لذلك دعونا نفعل هذا.
لذلك بما أننا نريد أن تكون شبكتنا العصبية كائنًا ، فسنقوم بعمل فصل دراسي.
وهذا لأنه أكثر ملاءمة.
معرفة أن الفصل هو نموذج لشيء نريد بناءه.
نريد بناء شبكة عصبية ، ونحتاج إلى عمل نوع من التعليمات التي سيتم تضمينها
جميعًا في الفصل.
وفي هذا الفصل سنقوم بعمل وظيفتين.
أولاً ، وظيفة init ، وهي الوظيفة التي تظهر طوال الوقت عند إنشاء فئة والتي
تحدد بشكل أساسي متغير الكائن الخاص بك.
هذه هي الشبكة العصبية ، كما تعلمون ، المتغيرات المرتبطة بالكائن بدلاً من المتغيرات
العامة.
وهذا في وظيفة init هذه التي ستحدد بنية الشبكة العصبية ، وتحديد طبقة الإدخال
التي ستتألف من خمسة عصبونات إدخال لأن لدينا خمسة أبعاد للمتجه المشفر لحالة
الإدخال ، ثم سنقوم بتعريف بعض الطبقات المخفية .
ربما سنبدأ بطبقة واحدة مخفية وبعد ذلك سيكون موضع ترحيب لتجربة بعض البنى الأخرى
للشبكة العصبية.
وبعد ذلك بالطبع سننتهي بطبقة المخرجات التي ستحتوي على الإجراءات المحتملة التي يمكننا
لعبها في كل مرة.
هذا ما سنفعله بالضبط في هذه الدالة init.
وبعد ذلك سنقوم بعمل وظيفة أخرى لا تزال داخل الفصل ، والتي ستكون وظيفة الأمام والتي
ستكون الوظيفة التي ستنشط الخلايا العصبية في الشبكة العصبية ، كما تعلم
، والتي ستنشط الإشارات.
ولذا سوف نستخدم وظيفة تنشيط المعدل لأننا بالطبع نتعامل مع مشكلة غير خطية
بحتة وهذه وظيفة المعدل تكسر الخطية.
لكن في الغالب نقوم بعمل هذه الوظيفة الأمامية لإرجاع قيم Q ، وهي مخرجات الشبكة
العصبية.
لكن لدينا قيمة جديلة واحدة لكل إجراء ، وبعد ذلك سنعيد الإجراء النهائي إما بأخذ الحد
الأقصى لقيم جديلة أو باستخدام طريقة soft max.
سنرى ذلك بعد ذلك.
لذلك في هذا البرنامج التعليمي سنبدأ بتنفيذ وظيفة init وفي المرحلة التالية
سنقوم بتنفيذ وظيفة الأمام.
لذلك دعونا نفعل هذا.
أولاً ، نحتاج إلى تقديم صفنا.
لذلك نبدأ بالصف.
ثم نعطي اسمًا لفصلنا وهو اسم جيد يمكننا تسميته بالشبكة.
وبعد ذلك في فئة الشبكات هذه ، سأستخدم تقنية برمجة الكائنات والتي تسمى الميراث
، وهذا فقط للتوريث من جميع الأدوات الخاصة بالفئة الأم.
لذا فإن فئة الشبكة التي نحن على وشك تكوينها هي فئة فرعية من فئة أكبر ، وهي وحدة
RN DOT.
هذا مجرد وراثة من جميع أدوات فئة الوحدة هذه ، والتي هي بالطبع الأدوات اللازمة لتنفيذ
شبكة عصبية.
هذه خدعة قوية وفعالة للغاية في البرمجة الشيئية التي تسمى الوراثة.
والآن نحن نرث من فئة الأصل هذه الوحدة.
حسنا.
والآن نحن جاهزون للدخول إلى الفصل.
أضغط على مفتاح الإدخال مرتين ، لأننا سنصنع دالتين ونبدأ
بالدالة init.
لذا ، يجب أن نسميها بهذه الطريقة بشرطتين سفليتين ثم بداخلها.
ثم مرة أخرى للتأكيد على أن هذا مجرد بناء جملة بايثون ، هذه هي الطريقة التي يتعين علينا القيام بها
ومن ثم نحتاج إلى إدخال الحجج.
إذن لدينا ثلاث حجج.
الأول هو حجة إلزامية هي في الواقع الذات والذات.
لا يوجد لغز حوله يشير إلى الكائن الذي سيتم إنشاؤه من هذه الفئة التي نحن على وشك صنعها.
كما تعلم ، نحن نصنع هذا الفصل.
إنها مثل بعض التعليمات ، نموذج ما لهذه الشبكة العصبية التي نريد بناءها.
وبعد ذلك بمجرد أن يصبح الفصل جاهزًا ، يمكننا إنشاء العديد من الشبكات العصبية كما نريد.
وستكون كل شبكة من هذه الشبكات العصبية شيئًا من هذه الفئة.
ونظرًا لأننا سنستخدم الكائن في بعض الأغراض الأخرى ، فنحن بحاجة إلى تحديد متغيرات
الكائن.
ولإكتشاف ذلك ، نستخدم هذه الذات هنا لتحديد أننا نشير إلى الكائن.
لذلك عندما أرغب في استخدام متغير من الكائن الخاص بي ، سأستخدم self قبل المتغير لتحديد
أن هذا متغير من الكائن.
حسنا.
هذه هي الحجة الأولى.
ومن ثم لدينا حجتان أخريان هما ، بالطبع ، عدد الخلايا العصبية المدخلة وعدد الخلايا
العصبية الناتجة.
إذاً عدد الخلايا العصبية المدخلة ، سنسميها حجم الإدخال.
وهذا في الواقع خمسة لأن متجهات الإدخال لدينا لها خمسة أبعاد ، الإشارات الثلاث زائد الاتجاه
زائد ناقص الاتجاه.
هذا هو متجهنا للقيم المشفرة التي تصف حالة واحدة من البيئة.
هذه القيم الخمس كافية لوصف حالة البيئة.
كان من الممكن أن نفكر في قيم أقل أو قيم أكثر ، لكن هذا ما جربته.
وهذا منطقي بالفعل لأننا نحتاج في الواقع إلى إشارة واحدة من اليسار ، واحدة أمامنا وواحدة
على اليمين.
كما تعلم ، عندما نقود سيارة ، كان من الممكن أن نذهب للحصول على إشارة 360 ، كما تعلمون ، مثل الإشارات الموجودة
أعلى سيارات Google.
لكن يمكننا القيادة الذاتية تمامًا باستخدام ثلاثة أجهزة استشعار.
ومن ثم لدينا هذا التوجه والتوجيه الناقص ، كما تعلمون ، لتتبع الهدف الذي نحاول
الوصول إليه.
ثم لدينا بالطبع الخلايا العصبية الناتجة من شبكتنا العصبية التي تتوافق مع الإجراءات.
ولدينا ثلاثة أفعال محتملة تتجه يسارًا ، أو مستقيمًا أو يمينًا.
وبالتالي سأسميها وأكون عملاً.
وسيكون هناك ثلاثة منهم.
حسنا.
لكن حتى الآن ، علينا فقط إعطاء أسماء للمدخلات وبعد ذلك سنستخدم هذه المتغيرات لإجراء الحسابات داخل
الشبكة العصبية.
حسنا إذا.
سأبدأ باستخدام خدعة أخرى من PyTorch.
هذه الحيلة هي الوظيفة الفائقة.
هذه وظيفة ترث بالفعل من وحدة RN.
لهذا السبب كان علينا استخدام الوراثة لوراثة أداة الوحدة النمطية.
هذه هي الأداة الأولى التي نستخدمها.
وبالتالي نحن نستخدم هذه الخدعة الفائقة فقط ، هذه الوظيفة الفائقة لنكون قادرين على استخدام أدوات
الوحدة.
لذلك هذا أكثر كفاءة.
وداخل هذه الوظيفة الفائقة ، أريد فقط تحديد الشبكة أولاً.
هذه هي فئة الشبكة الفرعية الخاصة بنا ، كما تعلمون ، لأن هذا موروث من فئة
أصل الوحدة النمطية ثم الكائن الخاص بنا ، ثم أقوم فقط بإضافة نقطة و / أو وظيفة init مثل هذه تمامًا كما أطلقنا عليها.
حسنا.
هذه مجرد خدعة لاستخدام جميع الأدوات في تلك الوحدة ، ثم يمكننا الانتقال
إلى الخطوة التالية ، وهي تحديد طبقة الإدخال.
لذلك ، ما علي فعله هو تقديم متغير جديد سيتم إرفاقه بالكائن وسيحتوي هذا المتغير
على عدد الخلايا العصبية المدخلة.
حتى لا يتم الخلط بينه وبين حجم المدخلات.
حجم الإدخال هو وسيطة دالة init ، ولكن هذا ليس المتغير المرتبط بالكائن
ولكن المتغير المرتبط بالكائن.
حسنًا ، كما ذكرت للتو ، نحتاج إلى تحديد أنه مرتبط بالكائن بدلاً من ذلك.
لذلك نستخدم نقطة ذاتية ونعطي الآن اسمًا لهذا المتغير الأول المرتبط بالكائن.
ولذا يمكننا ببساطة إعطاء نفس اسم الإدخال.
يمكننا أن نسميها حجم الإدخال ، وسنقول إنها تساوي وسيطة دالة init التي هي حجم
الإدخال.
حسنا.
لذلك في كل مرة أقوم فيها بإنشاء كائن من فئة الشبكة وأحدد حجم الإدخال ، على سبيل المثال
، أقوم بإدخال خمسة ، سيكون هناك خمسة هنا ، وبالتالي فإن متغير حجم الإدخال في الكائن سيكون
له القيمة من خمسة لأن حجم المدخلات هنا سيكون خمسة ، وبالتالي فإن شبكتنا العصبية ستحتوي على
خمسة عصبونات مدخلات في طبقة الإدخال.
حسنا.
ومن ثم فإن هذا هو نفسه بالنسبة للمتغير الآخر الذي نريد ربطه بالكائن.
وكما قد تكون خمنت ، سيكون هذا متغيرًا لعدد الخلايا العصبية الناتجة.
وللقول إننا نأخذ ذاتنا للشيء ثم نعطي اسمًا لهذا المتغير الثاني من الكائن
الذي سنطلق عليه اسم الفعل.
وسيكون هذا مساويًا لهذه الحجة هنا ، مع إعطاء عدد الإجراءات ، أي عدد الخلايا العصبية
الناتجة.
ولذا فإننا نساويها ونكون فعلًا.
إذن في الواقع سيكون الإجراء يساوي ثلاثة.
لذلك ، فإن المتغير والإجراء المرتبطين بكائننا بشبكة سيحصلان على قيمة ثلاثة.
في الواقع ، يمكننا أن نرى تحذيرًا هنا.
يقول اسم غير محدد ثم حسنًا ، لأننا هنا نستخدم اختصار RN ونحتاج إلى استخدام الاختصار
هنا ثم في النهاية في الوحدة النمطية ثم يختفي.
ها نحن ذا.
في احسن الاحوال.
الآن ليس لدينا تحذيرات.
جميع التحذيرات هنا هي فقط لتحديد أن ما نستورده لم يتم استخدامه بعد.
لكن لا مشكلة.
سنستخدمهم بعد ذلك.
حسنًا ، لدينا متغيرين آخرين.
نريد تحديد أربعة أشياء.
وستكون هذه هي الاتصالات الكاملة ، الروابط الكاملة بين الطبقات المختلفة لشبكتنا
العصبية.
لذلك بما أننا نريد الآن إنشاء شبكة عصبية تتكون من طبقة مخفية واحدة فقط ، حسنًا ، سيكون
هناك اتصالان كاملان.
سيكون هناك اتصال كامل 1/1 بين طبقة الإدخال والطبقة المخفية ، و 1/2 اتصال كامل
بين الطبقة المخفية وطبقة الإخراج.
لذلك لنبدأ بأول اتصال كامل.
سنسميها FC one.
ومرة أخرى ، أستخدم self هنا لتحديد أن FC one هو متغير الكائن الخاص بي.
حتى النفس هذا FC واحد.
الذي سيكون مساويا ل.
والآن نستخدم الوحدة RN وسنستخدم دالة تسمى الخطية.
وهذا بالضبط لجعل هذا الاتصال الكامل بين الخلايا العصبية في طبقة الإدخال والخلايا العصبية للطبقة
المخفية.
وماذا أعني بالارتباط الكامل؟
هذا يعني أن جميع الخلايا العصبية في طبقة الإدخال سيتم توصيلها جميعًا بجميع الخلايا العصبية في الطبقة
المخفية.
ولإجراء هذا الاتصال الكامل ، نستخدم هذه الدالة الخطية التي نحتاج إلى إدخال بعض الحجج لها.
وكما ترون ، هذه الحجج في الميزات.
هذا هو عدد الخلايا العصبية في الطبقة الأولى التي نريد توصيلها.
ثم الميزات الخارجية ، وهي عدد الخلايا العصبية للطبقة الثانية التي نريد توصيلها.
هذه هي الطبقة الموجودة على اليمين ، وهي الطبقة المخفية والانحياز يساوي true.
متحيز لذلك يساوي صحيح.
سنحتفظ بالقيمة الافتراضية التي من أجل الحصول على تحيز وليس فقط طريقة ما للربط بالخلايا
العصبية ، سيكون لدينا وزن وتحيز واحد لكل طبقة.
حسنًا ، دعونا نرى ما نحتاج إلى إدخاله.
لذا فإن الحجة الأولى في الميزات هي عدد الخلايا العصبية المدخلة في طبقة الإدخال.
وماذا إذن؟
حسنًا ، هذا في الواقع حجم المدخلات.
هذه هي سعة دالة init ، والتي ستساوي فيما بعد خمس إشارات اتجاه الاتجاه وسالب
الاتجاه.
حسنا هيا بنا.
نقوم بإدخال حجم إدخال الوسيطة الأولى.
ثم الحجة الثانية حول الميزات.
هذا هو عدد الخلايا العصبية التي نريد الحصول عليها في الطبقة الثانية ، الطبقة الثانية التي سيتم
توصيلها بالكامل بالطبقة الأولى.
والسؤال المطروح الآن هو ، كم عدد الخلايا العصبية التي نريدها في هذه الطبقة المخفية؟
حسنًا ، لقد أجريت الكثير من ضبط المعلمات.
لقد قمت بالكثير من التجارب.
هذا ما نفعله في الذكاء الاصطناعي أو هذا ما نفعله في التعلم العميق.
بشكل عام ، نقوم بالكثير من التجارب لمعرفة ما هي أفضل شبكة عصبية لمشكلتنا المحددة.
وهكذا جربت العديد من القيم وانتهى بي الأمر باختيار 30 ، 30 خلية عصبية في طبقة مخفية.
وسترون أنه بهذا الرقم ، سنحصل على بعض النتائج الجيدة.
لكن بعد ذلك لا تتردد في تغيير بنية الشبكة العصبية.
لا تتردد في اللعب بها.
لا يمكنك فقط تغيير عدد الخلايا العصبية المخفية في الطبقة المخفية ، ولكن يمكنك
أيضًا إضافة المزيد من الطبقات حتى تحصل على سيارة أفضل.
لكن 3000 خلية عصبية ستوفر لنا شبكة عصبية جيدة وسيارة جيدة.
لذلك هذا ما نسعى إليه.
وها نحن ذا.
لدينا أول اتصال كامل مع هذه الدالة الخطية.
نجعل الاتصال الكامل بين طبقة الإدخال والطبقة المخفية.
والآن حان الوقت لإجراء الاتصال الكامل الثاني.
هذا هو الاتصال الكامل بين الطبقة المخفية وطبقة الإخراج.
لذا ها نحن ذا.
سنقوم باستدعاء هذا الاتصال الكامل الثاني.
FC two ها نحن ذا.
ولا يزال هذا متغيرًا من موضوعنا.
لذلك أنا أستخدم الأشياء هنا ثم نستخدمها جيدًا في الواقع يمكننا نسخ هذا لأننا
سنستخدم الوحدة RN ثم الوظيفة الخطية ، ولكن بعد ذلك نحتاج إلى تغيير الحجج بالطبع أولاً.
نفس الشيئ.
الأول هو عدد الخلايا العصبية التي نريد الحصول عليها في الطبقة الأولى من اتصال الطعام.
إذن هذه هي الطبقة المخفية ، وبالتالي فهي 30.
ثم الحجة الثانية هي عدد الخلايا العصبية في الطبقة الثانية لاتصال الطعام والتي
تتوافق مع طبقة الإخراج.
وطبقة المخرجات تحتوي على خلايا عصبية فعلية وستكون لاحقًا ثلاثة لأن لدينا ثلاثة أفعال
محتملة.
لكن حتى الآن علينا استخدام الأسماء التي حددناها ، وهي أسماء وسيطة الدالة
init وبالتالي فإننا ندخلها هنا ونكون إجراءً.
وها نحن ذا.
بادئ ذي بدء ، اتصلانا الكاملان جاهزان وثانيًا ، وظيفة init جاهزة.
إذن هذا ما سنهيئ كائننا كلما أنشأنا كائنًا من فئة الشبكة.
وبمجرد إنشاء كائن ، حسنًا ، كل هذه المتغيرات ، سيتم تحديد المتغيرات الأربعة
هنا حجم الإدخال ويكون الإجراء FC واحد و FC 2.
وهذه هي الطريقة التي سنحصل بها على بنية شبكتنا العصبية.
لكل كائن نقوم بإنشائه ، سيتوافق كل كائن مع شبكة عصبية مكونة من خمسة عصبونات إدخال
و 30 خلية عصبية مخفية وثلاث خلايا عصبية ناتجة.
لذا ها نحن ذا.
لقد انتهينا من وظيفة init الأولى والآن يمكننا الانتقال إلى الوظيفة الثانية ،
وهي الوظيفة الأمامية والتي سيتم استخدامها لتنشيط الخلايا العصبية في الشبكة العصبية باستخدام
وظيفة تنشيط المعدل ، وفي الغالب لإرجاع Q في النهاية القيم التي هي نواتج شبكتنا العصبية.
لذلك لا يمكنني الانتظار للقيام بذلك في البرنامج التعليمي التالي.
وحتى ذلك الحين ، استمتع.
أنا.