كتابة : زيد اليافعي
TensorFlow.js هي عبارة عن مكتبة تم بناؤها على deeplearn.js للسماح للمستخدمين من إنشاء نماذج تعلم متعمق Deep learning modules على المتصفح مباشرة. وبالتالي يمكن إنشاء RNN CNN الخ بسهولة بالغة بإستخدام ال GPU للعميل وليس السيرفر. في هذا المقال سأقوم بشرح مبادئ بسيطة عن هذه المكتبة وكيفية إستخدامها لإنشاء نماذج مختلفة.
ملاحظة هامة قبل البدء في قراءة المقال يجيب أن يكون لديك معرفة مبدئية عن NN ومبادئ عملها. كما يحبذ أن يكون لديك معرفة في الجبر الخطي و المصفوفات بشكل عام وكيفية إجراء الحسابات عليها. معرفة الجافا سكريبت مفضلة وليس متطلب.
قبل كل شيء يمكن استخدام المكتبة في أي صفحة بإضافة التالي
حجر الأساس Tensors
معظم مكاتب تعليم الآلة تقوم على أستخدام وحدات أولية تسمى Tensors ولا ترتبك عند سماع هذا المصطلح هي فقط عبارة عن مصفوفات في فضاءات عالية. مثلاً سنقوم بإنشاء مصفوفة من عدد ثابت
كذلك يمكننا إنشاء مصفوفة تتكون من صف واحد يحتوي على رقمين
حتى نسترجع حجم المصفوفة يمكننا استخدام shape والذي يقوم بإرجاع متجه يمثل حجم المصفوفة
في المثال السابق حجم المصفوفة [2]. كذلك يمكننا إنشاء مصفوفة تتكون من أصفار بالحجم الذي نختاره كما في المثال التالي
العمليات الحسابية
في هذا الفصل سنتعلم كيفية القيام بعمليات حسابية على المصفوفات. مثالاً بإمكاننا حساب تربيع المصفوفة “ضرب المصفوفة في نفسها” كالآتي
ناتج العملية سيكون المصفوفة [4,9,16]. بإمكاننا كذلك استخدام عمليات حسابية متتالية على نفس المصفوفة. مثلاً بإمكاننا حساب الأس الرابع للمصفوفة بإستخدام التربيع مرتين
تحرير الذاكرة غالباً نقوم بإستخدام الكثير من المصفوفات لكن نسترجع فقط المصفوفة الأخيرة الناتجة من عمليات مختلفة. هذا يشكل عبء على الذاكرة لذلك يجب علينا التخلص من المصفوفات في الخطوات الفرعية. لتحرير الذاكرة من مصفوفة معينة
للتخلص بشكل اتوماتيكي من المصفوفات الفرعية
في المثال السابق الذاكرة المخصصة ل y سيتم التخلص منها اتوماتيكيا.
حساب القيم الصغرى
في هذا المثال سنقوم بحساب القيم الصغرى للدالة
نلاحظ من خلال رسمة الدالة أن القيمة الصغرى هي قريبة من الصفر. نستطيع حساب القيم القصوى بإستخدام optimizer وهو عبارة عن خوارزمية تقوم بحساب المشتقة ومن ثم إتباع الميل لإيجاد القيم الصغرى للدالة. هناك العديد من الخوارزميات التي وفرتها المكتبة. من أكثر الخوارزميات استخداماً هي خوارزمية آدم. في البداية سنتعلم كيفية كتابة معادلة الدالة
بعدها نقوم بإستخدام خوارزمية آدم لحساب قيم الدالة القصوى. نلاحظ أن الدالة التالية تقوم بتغيير قيمة المتغير y وتقوم بإرجاع أصغير قيمة له
بعد تشغيل الخوارزمية لعدة مرات نلاحظ أن القيمة بعد 200 مرة هي عبارة عن 0.160924- وهي المتوقع الحصول عليها. نلاحظ أننا استخدمنا معامل التعلم lr واستخدمنا قيمة 0.9 وهو عبارة عن ثابت يمثل مدى سرعة الخوارزمية في تغيير قيمة المتغير y. إذا استخدمنا معامل تعلم أكبر ربما لن نستطيع الوصول لقيم الدالة القصوى.
شبكة عصبية بسيطة
هنا سنتعلم كيفية إنشاء شبكة عصبية بسيطة. ستقوم الشبكة بتعلم كيفية توقع نتيجة XOR ممثلة بالجدول التالي
A XOR B | B | A |
0 | 0 | 0 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
في البداية ننشيء بيانات التدريب كما في الجدول مع الناتج الحقيقي للدالة
سنقوم بإنشاء شبكة عصبية تتكون من طبقتين layers و activation functions باعتبارها دالة غير خطية. ثم نقوم بإستخدام خوارزمية SGD و معامل تعلم يساوي 0.1
نشغل الخوارزمية ل 5000 مرة
بعد ذلك نختبر قدرة الخوارزمية باستخدام قيم التدريب
الناتج كما هو متوقع سيكون
شبكة عصبية التفافية CNN
يتم حساب اشتقاق الدوال في المكتبة بإستخدام شبكات حسابية بشكل تلقائي. ماعلينا إلى إنشاء الطبقات الالتفافية وسيتم الحل بشكل أتوماتيكي. لإنشاء الطبقات يجب في البداية إنشاء هيكل فارغ
بعد ذلك نقوم بإضافة طبقات التفافية. يتم في البداية تحديد حجم المدخل للطبقة. في هذا الهيكل نستخدم مدخل من صور ابيض واسود وحجم [28,28,1] حيث تمثل الخانة الأخيرة 1 عدم وجود الوان في الصورة
لإضافة الطبقة للهيكل
هنا نقوم بإنشاء شبكة للتعرف على كتابة الأرقام
لكي نختبر الشبكة يجب علينا وضع مدخل يتكون من اربعة أرقام يمثل الأول حجم الباتش Batch ( حجم حزمة التدريب في دورة واحدة للخوارزمية)، مثلاً نستخدم للنموذج السابق
لكي نعرف مخرج طبقة معينة بإمكاننا استخدام المدخل ونرى حجم المخرج لهذه الطبقة
بعد ذلك نستخدم خوارزمية آدم ومعامل تعلم
ثم نقوم بإضافة الخوارزمية للشبكة التي قمنا بإنشائها
التدريب على بيانات
نقوم بتحديد مدخل يتكون من أصفار لكي نتأكد من صحة الخوارزمية
كل مرة نشغل الكود السابق ستتعلم الشبكة معلومات إضافية تمكنها من التمييز.
حساب دقة التصنيف
لكي نحسب مدى قدرة الشبكة التي قمنا بإنشائها يمكننا استخدام history
السطر الأول يرجع قيمة حقيقية وهي عبارة عن قيمة تمثل مدى أداء الشبكة ومتى كانت القيم وفق دل ذلك على تطور في أداء الشبكة. القيمة الثانية تمثل نسبة القيم الصحيحة بالنسبة للأداء الكلي الشبكة.
استخدام صور من المتصفح
إذا كان لدينا صورة في المتصفح مخزنة في كانفاس
بعد ذلك يمكن تحويل الداتا إلى tensors ، و من ثم نقوم بمعالجة المصفوفة حتى تكون متاحة للتصنيف في الشبكة التي أنشأناها مسبقاً
نقل التعلم
افترض أن لدينا شبكة معينة دربناها على تعلم التفريق بين آلاف الأصناف ، فإن هذه الشبكة يمكن استخدامها في تعلم أشياء اخرى مختلفة. يرجع ذلك لإن الشبكة غالباً ماتتعلم اشياء هندسية عامة مثلاً الخطوط والدوائر وبالتالي يمكن الاستفادة من ذلك في نقل التعلم لأشياء أخرى. من أهم الشبكات العصبية هي تلك التي تم تدريبها على ImageNet وهي عبارة عن بيانات تحتوي على 1000 نوع من الأصناف. بالتالي متى كان المدخل لهذه الشبكة صورة فإنها تقوم بإنتاج احتمالية أن تكون الصورة واحدة من الألف نوع. هذه المكتبة توفر لنا شبكة تم تدريبها مسبقاً على هذه البيانات واسمها mobilenet ، نقوم بتحميل الشبكة بإستخدام
باستطاعتنا التعرف على المدخل والمخرج لإي طبقة في هذه الشبكة العصبية بإستخدام التالي
بالتالي نستنتج ان الشبكة تاخذ صور من حجم [1,224,224,3] وتنتج مخرج من الحجم [1,1000] والذي يمثل الاحتمالية التي ناقشناها سابقاً. مثلاً بإمكاننا توقع إحتمالية مصفوفة من الأصفار
نقوم بطباعة النوع الذي يتحوي أعلى احتمالية والذي هو في هذه الحالة 21 والذي يمثل طائرة ورقية. كذلك بإمكاننا التعرف على حجم الشبكة و اسم أي طبقة في الشبكة
لكي نقوم بالاستفادة من هذه الشبكة لتعلم أشياء اخرى مثلاً لتعلم الفرق بين الجزر والخيار يجب علينا حذف الطبقات الأخيرة والتي لديها مخرج يتكون من 1000 نوع. مثلاً نقوم بإختيار طبقة معينة من الشبكة
ومن ثم نقوم بإنشاء شبكة جديدة يكون المخرج لها الطبقة التي اخترناها
بإمكاننا التعرف على حجم الطبقة الأخيرة في الشبكة الجديدة
الآن نقوم بإضافة طبقات جديدة للشبكة تحتوي على مخرجين للتفريق بين النوعين
الفكرة هي كالآتي: في البداية نقوم بحساب مخرج الشبكة الجديدة التي أنشأناها ومن ثم ندخل النواتج للطبقة السابقة
في هذه الحالة لا نحتاج لتدريب الشبكة السابقة وإنما نقوم بتدريب الطبقة الأخيرة فقط بإستخدام الطرق التي شرحناها في الأمثلة السابقة.
النهاية
في هذا الدرس تعلمنا كيفية إنشاء شبكات عصبية ، تعليمها على المتصفح أو نقل التعلم من شبكة إلى شبكة أخرى. هناك الكثير الذي يمكنك تعلمه عن TensorFlow.js ولكن في هذا المقال أحببت أن أوضح أكثر المفاهيم أهمية. معظم الكودات يمكنك إيجاده في الأسفل.