نقدّم لك أهلاً بك الأهليّة

1. قبل البدء

في هذا الدرس التطبيقي، ستتعلّم كيفية تعلّم القواعد الأساسية التي تحدّد العلاقة بين الأرقام بدلاً من برمجة قواعد صريحة بلغة، مثل Java أو C++.

فكِّر في المشكلة التالية: يجري إنشاء نظام يتيح التعرُّف على النشاط من أجل تتبُّع مستوى اللياقة البدنية. قد تتمكن من الوصول إلى السرعة التي يتّبعها المستخدم في المشي ومحاولة استدراجها بناءً على تلك السرعة باستخدام شرط شرطي.

cc3628d9a1547597.png

if(speed<4){
  status=WALKING;
}

يمكنك تمديد تلك المدة حتى تعمل مع شرط آخر.

f2cc3929221107b8.png

if(speed<4){
    status=WALKING;
} else {
    status=RUNNING;
}

في حالة أخيرة، يمكنك بالمثل رصد الدرّاجة.

aeb282cf03d5cff.png

if(speed<4){
    status=WALKING;
} else if(speed<12){
    status=RUNNING;
} else {
    status=BIKING;
}

الآن، فكر في ما يحدث عندما تريد تضمين نشاط، مثل الغولف. أقل وضوحًا في كيفية إنشاء قاعدة لتحديد النشاط.

fc772abb6fee2804.png

// Now what?

من الصعب جدًا كتابة برنامج يتعرَّف على نشاط الغولف، فماذا تفعل؟ يمكنك استخدام تعلّم الآلة لحل المشكلة.

المتطلبات الأساسية

قبل تجربة هذا الدرس التطبيقي حول الترميز، عليك إجراء ما يلي:

  • معرفة راسخة بلغة Python
  • مهارات البرمجة الأساسية

ما ستتعرّف عليه

  • أساسيات تعلُّم الآلة

العناصر التي سيتم إنشاؤها

  • النموذج الأول لتعلم الآلة

المتطلبات اللازمة

إذا لم تنشئ نموذج تعلّم الآلة مطلقًا باستخدام TensorFlow، يمكنك استخدام بيئة Colaboratory التي تستند إلى المتصفّح وتحتوي على جميع الاعتماديات المطلوبة. يمكنك العثور على الرمز لبقية الدرس التطبيقي حول الترميز قيد التشغيل في Colab.

إذا كنت تستخدم IDE مختلفًا، تأكّد من تثبيت Python. يجب أيضًا استخدام TensorFlow ومكتبة NumPy. ويمكنك التعرُّف على مزيد من المعلومات حول TensorFlow وتثبيتها هنا. ثبِّت تطبيق NumPy هنا.

2. ما المقصود بتعلّم الآلة؟

يجب مراعاة الطريقة التقليدية لإنشاء التطبيقات، كما هو موضح في المخطط التالي:

C72f871306134e45.png

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

إنّ عملية الكشف عن حالة النشاط من خلال تعلّم الآلة متشابهة جدًا، حيث تكون المحاور فقط مختلفة.

9b85a337ee816e1b.png

بدلاً من محاولة تحديد القواعد والتعبير عنها بلغة برمجة، يمكنك تقديم الإجابات (يُطلق عليها عادةً التصنيفات) مع البيانات، ويستنتج الجهاز القواعد التي تحدّد العلاقة بين الإجابات والبيانات. على سبيل المثال، قد يبدو سيناريو اكتشاف النشاط بهذا الشكل في سياق تعلُّم الآلة:

6ff58697a85931f4.png

أنت تجمع الكثير من البيانات وتصنِّفها لقول مثلاً: "هذا هو الشكل الذي يظهر به المشي" أو "&" أو "هذا هو الركض". وبعد ذلك، يستنتج جهاز الكمبيوتر القواعد التي تحدد من البيانات، ماهية الأنماط المميزة التي تشير إلى نشاط معين.

وبالإضافة إلى كونها أسلوبًا بديلاً لبرمجة هذا السيناريو، تمنحك هذه الطريقة أيضًا القدرة على فتح سيناريوهات جديدة، مثل رياضة الغولف التي لم يكن من الممكن تنفيذها بموجب منهج البرمجة التقليدي المستند إلى القواعد.

وفي البرمجة التقليدية، يتم تجميع الرمز في برنامج ثنائي يُعرف عادةً باسم البرنامج. في تعلّم الآلة، يُسمّى العنصر الذي تنشئه من البيانات والتصنيفات نموذجًا.

لذلك، إذا رجعت إلى هذا الرسم البياني:

53ff9e2cb511936e.png

ضع في اعتبارك أن هذه النتيجة تمثل نموذجًا يتم استخدامه كما يلي في وقت التشغيل:

693430bb4d7fa001.png

تمرر النموذج بعض البيانات ويستخدم النموذج القواعد التي تم استنتاجها من التدريب لوضع توقع مثل، "";تظهر هذه البيانات مثل المشي&&;أو "البيانات تبدو مثل ركوب الدراجات&"

3- إنشاء أول نموذج لتعلّم الآلة

يُرجى مراعاة مجموعات الأرقام التالية. هل يمكنك الاطّلاع على العلاقة بينهما؟

(س):

-1

0

1

2

3

4

ص:

-2

1

4

7

10

13

أثناء الاطّلاع عليها، قد تلاحظ أن قيمة X تزداد بمقدار 1 بينما تقرأ من اليسار إلى اليمين وأن القيمة Y تزيد بمقدار 3. تعتقد على الأرجح أنّ قيمة Y تساوي 3 أضعاف علامة الجمع أو ناقصة. بعد ذلك، قد تنظر إلى 0 على X وترى أن Y هو 1، وتتوصل إلى العلاقة Y=3X+1.

هذا هو بالضبط كيفية استخدام الرمز لتدريب نموذج لاكتشاف الأنماط في البيانات.

والآن، انظر إلى الرمز لتنفيذ ذلك.

كيف تدرِّب شبكة عصبونية على أداء المهام المقابلة؟ استخدام البيانات ومن خلال إطعام الخلاصة بمجموعة من X's ومجموعة Y's، من المفترض أن تتمكن من معرفة العلاقة بينها.

عمليات الاستيراد

ابدأ بعمليات الاستيراد. في ما يلي، أنت تستورد TensorFlow وتطلق عليه اسم tf لتسهيل الاستخدام.

بعد ذلك، استورِد مكتبة تُسمى numpy، وتمثّل بياناتك كقوائم بسهولة وسرعة.

يُطلق على إطار العمل تعريف شبكة عصبونية على شكل مجموعة من الطبقات التسلسلية اسم keras، لذا يجب استيرادها أيضًا.

import tensorflow as tf
import numpy as np
from tensorflow import keras

تحديد الشبكة العصبونية وتجميعها

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

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

بعد ذلك، اكتب الرمز لتجميع شبكتك العصبونية. وعند إجراء ذلك، عليك تحديد دالتَين، loss وoptimizer.

في هذا المثال، أنت تعلم أن العلاقة بين الأرقام هي Y=3X+1.

عندما يحاول جهاز الكمبيوتر معرفة ذلك، التخمين، قد يكون Y=10X+10. تقيس الدالة loss الإجابات التي تم تخمينها مقابل الإجابات الصحيحة المعروفة، وتقيس مدى جودة أو أداء سيئ.

بعد ذلك، يستخدم النموذج دالة optimizer لإجراء تخمين آخر. استنادًا إلى نتيجة دالة الفقد، يحاول الحد من الخسارة. في هذه المرحلة، قد يتوصل إلى شيء مثل Y=5X+5. على الرغم من أن ذلك لا يزال سيئًا للغاية، إلا أنه أقرب إلى النتيجة الصحيحة (الخسارة أقل).

يكرِّر النموذج ذلك مع عدد الفترات التي ستظهر لك بعد قليل.

أولاً، إليك كيفية إعلامه باستخدام mean_squared_error للفقدان والانخفاض التدريجي المتدرج(sgd) للمُحسِّن. لست بحاجة إلى فهم العمليات الحسابية حتى الآن، ولكن يمكنك معرفة أنها ناجحة.

وبمرور الوقت، ستتعرّف على الوظائف المختلفة والملائمة لوظائف الفقدان والمُحسِّن المناسبة لسيناريوهات مختلفة.

model.compile(optimizer='sgd', loss='mean_squared_error')

تقديم البيانات

بعد ذلك، خلاصة بعض البيانات. في هذه الحالة، ستأخذ المتغيّرات الستة X وستة Y من القيم السابقة. يمكنك ملاحظة أن العلاقة بين هذه القيم هي أن Y=3X+1، وبالتالي حيث يكون X هو -1، Y هو -2.

وتوفّر مكتبة python التي تُسمى NumPy الكثير من بُنى بيانات أنواع المصفوفات لتنفيذ ذلك. حدّد القيم كمصفوفة في NumPy باستخدام np.array[].

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)

لقد أصبح لديك الآن كل ما تحتاجه لتحديد الشبكة العصبونية. وتتمثل الخطوة التالية في تدريبه لمعرفة ما إذا كان يمكنه استنتاج الأنماط بين هذه الأرقام واستخدامها لإنشاء نموذج.

4. تدريب الشبكة العصبونية

عملية تدريب الشبكة العصبونية، حيث تتعلّم العلاقة بين X's وY's، تكون في مكالمة model.fit. هذا هو الوقت الذي ستمر فيه الحلقة قبل إجراء تخمين، أو قياس مدى سوءها أو سوءها (الخسائر)، أو استخدام المُحسِّن لتقديم تخمين آخر. وستتم الإجابة عن عدد الفترات التي تحددها. وعند تشغيل هذا الرمز، ستلاحظ أنه ستتم طباعة الخسارة في كل فترة.

model.fit(xs, ys, epochs=500)

على سبيل المثال، يمكنك ملاحظة أنه في الفترات القليلة الأولى، تكون قيمة الخسارة كبيرة جدًا، ولكنها أصغر في كل خطوة.

f110d5abed07c1b9.png

ومع تقدّم التدريب، تزداد الخسائر قريبًا.

81ca5e71298b414b.png

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

12b187014b639fd.png

من المحتمل أنك لا تحتاج إلى جميع الفترات الـ 500 ويمكنك تجربة مبالغ مختلفة. كما ترى في المثال، كانت الخسارة صغيرة جدًا بعد 50 حقبة فقط، لذلك قد يكون ذلك كافيًا.

5. استخدام النموذج

لديك نموذج تم تدريبه لمعرفة العلاقة بين X وY. يمكنك استخدام طريقة model.predict لتحديد ص علامة X غير معروفة سابقًا. على سبيل المثال، إذا كانت قيمة X هي 10، ما رأيك بـ Y؟ خمِّن التخمين قبل تشغيل الرمز التالي:

print(model.predict([10.0]))

قد تظنّ أنّ هذا العام 31، ولكن هذه النتيجة قد انتهت. لماذا هذا برأيك؟

تتعامل الشبكات العصبونية مع الاحتمالات، لذا احتسبت وجود احتمال كبير جدًا أن العلاقة بين X وY هي Y=3X+1، ولكنها لا تستطيع فعل ذلك بالتأكيد من خلال ست نقاط بيانات فقط. النتيجة قريبة جدًا من 31، ولكن ليس بالضرورة 31.

عند العمل مع الشبكات العصبونية، ستلاحظ أنّ هذا النمط يتكرّر. ستتعامل دائمًا مع الاحتمالات، وليس الاحتمالات، وستفعل القليل من الترميز لمعرفة النتيجة التي تستند إلى الاحتمالات، وخصوصًا عندما يتعلق الأمر بالتصنيف.

6- تهانينا

هل تصدّق أنّ عليك تناول معظم المفاهيم التي تعلّمها في مجال تعلّم الآلة والتي ستستخدمها في سيناريوهات أكثر تعقيدًا لقد تعلمت كيفية تدريب شبكة عصبونية لتحديد العلاقة بين مجموعتين من الأرقام عن طريق تحديد الشبكة. لقد حدّدت مجموعة من الطبقات (في هذه الحالة فقط) تضمّنت عصبون (في هذه الحالة أيضًا واحدة فقط)، جمّعتها بعد ذلك باستخدام وظيفة للفقدان ومُحسِّن.

تعالج عملية جمع الشبكة ووظيفة الفقدان والمُحسِّن عملية تخمين العلاقة بين الأرقام وتقييم مستوى أدائها، ثم إنشاء معلمات جديدة للتخمينات الجديدة. اطّلِع على المزيد من المعلومات على TensorFlow.org.

مزيد من المعلومات

للتعرّف على كيفية الاستفادة من تعلُّم الآلة وTensorFlow في نماذج رؤية الكمبيوتر، يُرجى المتابعة إلى إنشاء نموذج للرؤية الحاسوبية باستخدام TensorFlow.