التعرّف على أبسط شبكة عصبية وتنفيذها خطوة بخطوة

ذات مرة صادفت كتابًا بعنوان "إنشاء شبكتك العصبية" ، تأليف طارق راشد . على عكس العديد من الكتب الأخرى على الشبكات العصبية ، في هذا كل شيء تم تقديمه بلغة بسيطة ، مع عدد كاف من الأمثلة والنصائح

مستوحاة من هذا الكتاب ، أريد أن أتصفحه خطوة بخطوة - أي ، الجزء العملي - كتابة التعليمات البرمجية لأبسط شبكة عصبية .
هذه المقالة مخصصة لأولئك الذين يرغبون في الانخراط في الشبكات العصبية والتعلم الآلي ، لكنهم حتى الآن يجدون صعوبة في فهم هذا المجال المدهش من العلوم. سيتم وصف الهيكل العظمي الأبسط لرمز الشبكة العصبية أدناه ، بحيث يفهم الكثيرون أبسط مبدأ البناء والتفاعل بين كل هذه الشبكة العصبية.

الصورة


نظريات حول التعلم الآلي والشبكات العصبية على Habré كافية. ولكن إذا احتاج شخص ما إلى ذلك ، سأترك بعض الروابط في نهاية المقال. والآن ، سنبدأ كتابة التعليمات البرمجية مباشرةً ، وسوف نكتب في Python ، أوصي باستخدام Jupyter-Notebook عند كتابة التعليمات البرمجية

الخطوة 1. تهيئة الشبكة


أولاً ، بالطبع ، نحتاج إلى تهيئة جميع المكونات النشطة لشبكتنا

# numpy —    Python,        import numpy #  scipy.special , -scipy    , ,  ,      ,       ,   - " " import scipy.special #,      import matplotlib.pyplot #     class neuralNetwork: #     def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): #     ,   ,   ,  ) #     ,  ,   self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes #    , wih -       ,    who-       self.wih = numpy.random.rand(self.hnodes, self.inodes) self.who = numpy.random.rand(self.onodes, self.hnodes) #   -  ,  ,  ,    ,     ,     ,  ,  ,   self.lr = learningrate #  -   self.activation_function = lambda x: scipy.special.expit(x) 

السيني


تنتمي هذه الوظيفة إلى فئة الوظائف المستمرة ، وتأخذ رقمًا حقيقيًا عشوائيًا (أي ليس بالضرورة عددًا صحيحًا) عند الإدخال ، وتعطي رقمًا حقيقيًا في النطاق من 0 إلى 1 في الإخراج .

على وجه الخصوص ، تتحول الأرقام السالبة الكبيرة (المودولو) إلى صفر ، والأرقام الموجبة الكبيرة تتحول إلى واحد .

يتم تفسير ناتجها جيدًا على أنه مستوى تنشيط الخلايا العصبية: من غياب التنشيط (0) إلى التنشيط الكامل التشبع (1).

يتم التعبير عن السيني بواسطة الصيغة:

الصورة

الرسم البياني للدالة السيني وفقا للشكل أدناه:

الصورة

وظيفة السيني هي:

  • مستمر
  • زيادة رتابة.
  • قابل للتمييز.

في هذا الرمز ، يوجد السيني ، كما ترون ، تحت اسم expit (x)

قليلا عن كيف تبدو العقدة في الشبكة العصبية


الصورة

تُظهر الصورة أقصى هذه العقدة ، وعادةً ما يتم تقديمها في شكل دائرة فقط ، وليس مستطيلًا. كما نرى ، داخل مستطيل (بئر ، أو دائرة) - كل هذا مجرد ، هناك وظيفتان:

يتمثل النشاط الأول في حقيقة أنه يتلقى جميع المدخلات ، مع الأخذ في الاعتبار الأوزان والبيانات ، وأحيانًا مع الأخذ في الاعتبار الخلايا العصبية للإزاحة (عصبون خاص يتيح ببساطة الرسوم البيانية للتحرك ، وليس الاختلاط في مجموعة قبيحة واحدة ، هذا كل شيء)

تأخذ الدالة الثانية كمعلمة نفس القيمة التي لخصتها الوظيفة الأولى ، وهذه الوظيفة الثانية تسمى وظيفة التنشيط. في حالتنا ، السيني

نواصل :

الجزء 2. تدريب الشبكة العصبية


 def train(self, inputs_list, targets_list): #       inputs = numpy.array(inputs_list, ndmin=2).T #     input targets = numpy.array(targets_list, ndmin=2).T #  targets #      hidden_inputs = numpy.dot(self.wih, inputs) #  ,       .    ,       hidden_inputs (1 ),        -   (2 ) hidden_outputs = self.activation_function(hidden_inputs) #    ()  final_inputs = numpy.dot(self.who, hidden_outputs) #  ,     final_outputs = self.activation_function(final_inputs) #   ( - ) output_errors = targets - final_outputs #      ,    <b>  </b>,   <b>       </b>(      ) hidden_errors = numpy.dot(self.who.T, output_errors) #        ( ,      ) self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs)) #       (       ) self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs)) 

والآن نحن نقترب من النهاية

الجزء 3. استجواب شبكة العصبية


 #  ,      def query(self, inputs_list): #         inputs = numpy.array(inputs_list, ndmin=2).T #      hidden_inputs = numpy.dot(self.wih, inputs) #  ,     hidden_outputs = self.activation_function(hidden_inputs) #      final_inputs = numpy.dot(self.who, hidden_outputs) #     ,     final_outputs = self.activation_function(final_inputs) return final_outputs 

نأتي به إلى النهاية


 #     ,  ,  (  <b></b>-    , ,   input_nodes = 3 hidden_nodes = 3 output_nodes = 3 #    -   , ... 0.3! learning_rate = 0.3 #   (n    neuralNetwork ,      __init__ ,        n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate) 

PS


تم تقديم نموذج أبسط حسابي لشبكة عصبية. لكن لم يظهر تطبيق محدد.

إذا كنت ترغب في ذلك ، يمكنك المضي قدمًا عن طريق إضافة القدرة على التعرف على النص المكتوب بخط اليد في رمز MNIST ، حيث يمكنك معرفة ذلك بالكامل (والاستمتاع فقط) باستخدام ملف jupyter هذا ، وكانت مهمتي هي توضيح الكود ومضغه على الشبكة ، وإذا أمكن ماذا يجيب

PPS


ستجد أدناه روابط مفيدة:

1. رابط إلى جيثب طارق ->
2. كتابه ->
3. نظرية تعلم الآلة ->
4. نظرية تعلم الآلة ->
5. نظرية تعلم الآلة ->

Source: https://habr.com/ru/post/ar440190/


All Articles