مقدمة عن TensorFlow.js

السبت 24 محرم 1442ھ السبت 12 سبتمبر 2020م
فيسبوك
إكس
واتساب
تيليجرام
لينكدإن

1٬126 كلمة

20 دقيقة

المحتوى

79kCh4Ps8enDF6 fHx33RPzXQbseLeCisiM81cMeYs HYslX i0mBKtVyuSHwjlSwVYUmmwnF6y YV6WHJaJ3kdEQa8NnGkhjtvj3EmWFIVgh2 PGz2BgXmXFjFRtrRer32sGmAn

كتابة : زيد اليافعي

TensorFlow.js هي عبارة عن مكتبة تم بناؤها على deeplearn.js للسماح للمستخدمين من إنشاء نماذج تعلم متعمق Deep learning modules على المتصفح مباشرة. وبالتالي يمكن إنشاء RNN CNN الخ بسهولة بالغة بإستخدام ال GPU للعميل وليس السيرفر. في هذا المقال سأقوم بشرح مبادئ بسيطة عن هذه المكتبة وكيفية إستخدامها لإنشاء نماذج مختلفة.


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


قبل كل شيء  يمكن استخدام المكتبة في أي صفحة بإضافة التالي

5Q63e Cv

حجر الأساس Tensors

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

كذلك يمكننا إنشاء مصفوفة تتكون من صف واحد يحتوي على رقمين

dw7fHYqJgQraGg2q2ffAa8e3DfYdp2N2K26gncpbyR 8hGoYrsa 7f kjysDQw4i7gTNCy1Pk2hepLaElAUXP9Yee8frAk4wUf9pcS5mzjT4L 54qEBpxmf tAQzbOLa2Ku4DGJf

    حتى نسترجع حجم المصفوفة يمكننا استخدام shape والذي يقوم بإرجاع متجه يمثل حجم المصفوفة    

b2bT iqHMM7UpJbpsTTj6JhxjwOm6u8mTncYT2HxYmRVLnJziAxuU3FyMkH5WD0X1crDawcOy

    في المثال السابق حجم المصفوفة [2]. كذلك يمكننا إنشاء مصفوفة تتكون من أصفار بالحجم الذي نختاره كما في المثال التالي

lDO6ZLqqaoIyxZB5VjBNblthX1MF 21p1JOhYMgsrvrPwKSx8uROCxwniFcLAEb MhZO3bUxh4ytpsRyrapgX1v0hOgbv94K9A4Jx2QLO1EjZ4Ap6VIyguTt C12J9Z RJ8pfwVI

العمليات الحسابية

  في هذا الفصل سنتعلم كيفية القيام بعمليات حسابية على المصفوفات. مثالاً بإمكاننا حساب تربيع المصفوفة “ضرب المصفوفة في نفسها” كالآتي    

e7WHY3hNZtDrc2C8q8Ok744BqPgjP6xHJXLmhl5TBzifffzWerucxaz BjpmSzL1CLn5od fctikeUF7s3e X60RUUe 4A5nnuX KjtRSJbU0MX7cKNRfMwXCZu bEHRajklU4Iz

    ناتج العملية سيكون المصفوفة [4,9,16]. بإمكاننا كذلك استخدام عمليات حسابية متتالية على نفس المصفوفة. مثلاً بإمكاننا حساب الأس الرابع للمصفوفة بإستخدام التربيع مرتين

6AY1NJASr5qKfVC7q81RQajG5 vzMvNALx0Rrc2a2SysZPCNdp8No7G19CeNgObsjJsIH5SernSHlpqCz2rbVTcZJBvuRm4xvi7kzLEGwwtnZej1vvfziym69XiDiqQi8j E8b77

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

CBnOIxOWMerJd1dEywcREO6stjhRl5VgneX1ji6PCzGRc9r6RmbIomECSRoQTeYrofVFYVZN02iT5Y98wnS3YhXpXkEo2aisV ET3wcBY9KMifb9rE3 0GK KWKVrcRwVUvi9Z3k

    للتخلص بشكل اتوماتيكي من المصفوفات الفرعية  

2 oPXPHmohtHvQS6Tka5 F6uqicAMUiAU16OE Kmr9YJ6qN pABdSf9TVHIrggpSiSDbXSjxsldDPayuN jzfniTj1qzSmgvoS1Vklz8cu3jRMyOYAFoYirbQiXSP9wHd PfZjtq

    في المثال السابق الذاكرة المخصصة ل y سيتم التخلص منها اتوماتيكيا.    

حساب القيم الصغرى

في هذا المثال سنقوم بحساب القيم الصغرى للدالة

uDZXfgqV4VHdr53r YQEFD0vnHiq tNVbB3J2oylkY3EsgqU4 I8blct5sox989DP4ZTZI4WjmjUSuQYpyzK
QYnnSDHsgkWaKhRbF2tSYBbreRi YxIVd52 KxScfZ1 vN1BbVduGH0oBAwrvLUJZGrAKUv7RNxtWdUCELYrSWFvE3BGE PLRRfWjyzNWXmTk3OU6CDC0yoryy5z5EVWG3BjGoZ3

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

Ymr3akMNvIbQoY41mJ LjbJorjgM Dy70RS8mljkjehG7uoWw7Sj1O0upPB1hqvnlIEMJgRVi5aDrfjbXJewuxikfzGVsd vBuhtEcJnFsEl9UMGBw3eNl3mb

بعدها نقوم بإستخدام خوارزمية آدم لحساب قيم الدالة القصوى. نلاحظ أن الدالة التالية تقوم بتغيير قيمة المتغير y وتقوم بإرجاع أصغير قيمة له

u HfQnN8F03olIMqt1p37it0q0 p80QQgb36IJVHv7Yf38yZcx2a60nLaV8JlOVx8VCDCd7U MDirCp3hunj5PdwTG5

بعد تشغيل الخوارزمية لعدة مرات نلاحظ أن القيمة بعد 200 مرة هي عبارة عن 0.160924- وهي المتوقع الحصول عليها. نلاحظ أننا استخدمنا معامل التعلم lr واستخدمنا قيمة 0.9 وهو عبارة عن ثابت يمثل مدى سرعة الخوارزمية في تغيير قيمة المتغير y. إذا استخدمنا معامل تعلم أكبر ربما لن نستطيع الوصول لقيم الدالة القصوى.
شبكة عصبية بسيطة

هنا سنتعلم كيفية إنشاء شبكة عصبية بسيطة. ستقوم الشبكة بتعلم كيفية توقع نتيجة XOR ممثلة بالجدول التالي

A XOR BBA
000
110
101
011

في البداية ننشيء بيانات التدريب كما في الجدول مع الناتج الحقيقي للدالة

TnwC3UYMwr39ZlaWak5H1nli8g6aFwcMsEBjPGlquizTbSIUVCZAs5ioYobDjtlzF GrW nxUCirSHCGE40wq4gliBtasutZ8UVvLkBU1WBSTdN lyvLyaAsC1Qt2DI

سنقوم بإنشاء شبكة عصبية تتكون من طبقتين layers و activation functions باعتبارها دالة غير خطية. ثم نقوم بإستخدام خوارزمية SGD و معامل تعلم يساوي 0.1

HyHiJSXl93MX42FowA2LFTCEMNIsQ8FaxnpvDWVatui7o1OJRu84YPtx9 yRE8rc347Oq4jpS7XukOpNpRX9O0r5VXJYe9jIL6t9tU STZwfUPQS4fuQXlW

نشغل الخوارزمية ل 5000 مرة

0Ot6SuAFqNxdQ2Blc3vO6MFF4IASe1Tn8G4e 0ku0GSkghRz43DZPgVEeXkuasRWPaIoITnx

بعد ذلك نختبر قدرة الخوارزمية باستخدام قيم التدريب

CHOmB4sx8kb33FNFt26Lrqtoh7Hcnx Si3Ea1ej2SKuK7oztUiI pQSFL5ZDtMmBsfHllKPwhTGufGqlqIUjZT7KyXSZk DgB4cg7s5xnYncB3QcmbG7pH o36jGEhmEC5v7XaF

الناتج كما هو متوقع سيكون

DmK4CiHq8Id8k

 

 

شبكة عصبية التفافية CNN

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

vqfpY3p7Bkc94gDZG3G7TEEdznzVSarRdIOJfaT5k2IhEohRjtHvj4Chs7lhEQlQKc42f kuOMO0l216ZKQvDEvpfEq8JqeGsQeSA1F4LuO29hakKDMFdryt6RbZP20wTsTe rh

بعد ذلك نقوم بإضافة طبقات التفافية. يتم في البداية تحديد حجم المدخل للطبقة. في هذا الهيكل نستخدم مدخل من صور ابيض واسود وحجم [28,28,1] حيث تمثل الخانة الأخيرة 1 عدم وجود الوان في الصورة

f9IF5jRxmLJwgCiZDAFGKZ rXp1NF9HlvRt vqVBcJJPpqpjryS3n2vSjMhkKg3mTUZeSyvVpJlUjaRbJ6fKb46ExFogXEx0rT94mUR7WGYv fIKUqlmX2SLb0E9kIP LnfdampD

لإضافة الطبقة للهيكل

AWfJUfmKbVcr9q89Abt7fYErNnf1qr GC5zKNwjedlT4Affl2RFP8JKVtdaYWLd 8iPxBIpNze9GVkATiTR9 9sot8KQ3U82RwkClO6qDmaPAkPZBiGm0GQAyUdndRHDmly ddE8

هنا نقوم بإنشاء شبكة للتعرف على كتابة الأرقام

8xLl3xfY0c6zOY2TYSE4veBEemHBsV5CczEK2o q3liBCWhJncgF8FfdQ oTr7OjPGvUsCSVFLh

لكي نختبر الشبكة يجب علينا وضع مدخل يتكون من اربعة أرقام يمثل الأول حجم الباتش Batch ( حجم حزمة التدريب في دورة واحدة للخوارزمية)، مثلاً نستخدم للنموذج السابق


zKE7G6tZSGYINcF YRmidjs4T3AKmUxFHjGwUnsn5Hx52vZJAZjKsziYtO10V5nUAUVfK

لكي نعرف مخرج طبقة معينة بإمكاننا استخدام المدخل ونرى حجم المخرج لهذه الطبقة

VFvuOnxZYLIdqUx65PgdK bzIuj9Ij6rlMM5ZIfhnhFiURcXTU hTwRAZdTwHk3NEVHfu4fXw7Co Rm sG6Ne0h gp7yWuekNFTW5KdJ6yHDApsvV2IMhk5evrzo 23CKjWEATgA

بعد ذلك نستخدم خوارزمية آدم ومعامل تعلم

9p 75jZ29S9NJFcAOILk93unAIkaqRGiD MP9P79723OzXJ6bSke6ezZ5WU 3Q1ly8XuC 8J5CpHsNV H603yM06bE

ثم نقوم بإضافة الخوارزمية للشبكة التي قمنا بإنشائها

kEtiooBQborXExZYk5lIHgqixxQOxQ360d15oYLK1u5YnskDGbVEzvrYhTofp5zJU9vSIGM2ePIExmeg8WA5OaGPn2ugvt8hGI1v B8uD7J a7YaHVnVjC80WqlIOWAT0FPFvO t

التدريب على بيانات

نقوم بتحديد مدخل يتكون من أصفار لكي نتأكد من صحة الخوارزمية

wM1OrTO7NHMy jyAbP yfZsgWPIiGRmf6KxWngPIGOBhyA3x2v5XvM DM4MbMZUm1J4t7v wCYmLL tkXRe4ZQqbkCaWirPvaXfCeyem kti8RqfyleDb1JYI5TWO1Q3J iFF3

كل مرة نشغل الكود السابق ستتعلم الشبكة معلومات إضافية تمكنها من التمييز.
حساب دقة التصنيف

لكي نحسب مدى قدرة الشبكة التي قمنا بإنشائها يمكننا استخدام history

kMIqDUO0KnDYax9j3JChhikYniAfOA4 8Sb3LZwP6 eWs4oPhI40eQ9dce ZQCJ 2YwKwQjNVSymiGveP2qy2fWFr1q Og6QTYZtQlTfnG Pw7DE5YEr0ddAWaWLrCZqogcbZ62P

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

إذا كان لدينا صورة في المتصفح مخزنة في كانفاس

uioifnWWNxOASUvjhYfEF8kJut

بعد ذلك يمكن تحويل الداتا إلى tensors ، و من ثم نقوم بمعالجة المصفوفة حتى تكون متاحة للتصنيف في الشبكة التي أنشأناها مسبقاً

YOeQ1zKBhsvYe4z LPF5KiN4y3B8gVhnChH0r0uhbcTBHGmmxLaD IOScX8ECbJvPyFBbDHAG31C9lPHxqUiDiJMyfg808MV1WjLcy

نقل التعلم

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

3OfC4jK0Cpy8ZXiiWCt6sRVmdDwG7T 081QZhMlBT3hjgRAcNEl5BBmBnW5Jf6Os0XXfEXGdyqzXQqvXV1mLhK6cyJiaIFpXIywMB7J5IJjk1

   

باستطاعتنا التعرف على المدخل والمخرج لإي طبقة في هذه الشبكة العصبية بإستخدام التالي    

evhvKoSjadL1VmuEifhabzk9VChK05O coVyAoe3iagzCLUYV0pubt6xfc4tvLaoXT61GTXn7lyyTUjSyX8DDtocM70fXaQzuiYorEP03QAxuhoWzvLLnkG583 GsdqK5GyUJGtW

    بالتالي نستنتج ان الشبكة تاخذ صور من حجم [1,224,224,3] وتنتج مخرج من الحجم [1,1000] والذي يمثل الاحتمالية التي ناقشناها سابقاً. مثلاً بإمكاننا توقع إحتمالية مصفوفة من الأصفار    

    نقوم بطباعة النوع الذي يتحوي أعلى احتمالية والذي هو في هذه الحالة 21 والذي يمثل طائرة ورقية. كذلك بإمكاننا التعرف على حجم الشبكة و اسم أي طبقة في الشبكة    

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

2IJr3lGkgcvCL2ivBmK 7 Q6ym4cEwgiHh3QeXq4si9vomfxHNKWdKxQMOzQvh2lwXN3JD39yy0frP48shG2a5eVyT4WvaRYcfcz4uLLFpM1ygNXfqM v5aslwHn9FtpGVI7u dJ

    ومن ثم نقوم بإنشاء شبكة جديدة يكون المخرج لها الطبقة التي اخترناها    

3KdIdcUgIKp0IzeGvLz z dXAp cVUjPxMnOdRLAdQHjVSKz6HPIOjFf1fokbiXy8zHii9LmMvKm3O0TLjwHzNe jCkF2dZOhz1mHbz1ujhsEceINRRRg4vIkdJB2N1hdMoyhkG8

    بإمكاننا التعرف على حجم الطبقة الأخيرة في الشبكة الجديدة    

8ExL5UQ8WufXzu0KHHBot72t21oi8zoUAGfOiNhr7dkJYnhDeEgry6zQAmgcXU3YDMZ51Pvg6ON7Lva1F YtBAKXDd5l6jM1RbYq8xJf a076S7rTMUJ3oriMcXKk7YeqRDP8v4

    الآن نقوم بإضافة طبقات جديدة للشبكة تحتوي على مخرجين للتفريق بين النوعين    

W44VoX zq5fEQeWCV tcWtLKuRz3o j N4wsdjGC3JqvRRYRQ4zfi3e3tGfGW5gBfNHKbo6euxmnhq6TFWXOWUIOndtO6CvVuRKmLJ1tA5GAuFVsmmau7NvVm1idLbq4JR vT1L

  الفكرة هي كالآتي: في البداية نقوم بحساب مخرج الشبكة الجديدة التي أنشأناها ومن ثم ندخل النواتج للطبقة السابقة  

eTb8O738d65ls KSxlfgp84F7kmYUR4cPN7SZwM3u9Vx0SQghzGQriKDxylNOQU5o3G2PjRzT1l

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

النهاية 

في هذا الدرس تعلمنا كيفية إنشاء شبكات عصبية ، تعليمها على المتصفح أو نقل التعلم من شبكة إلى شبكة أخرى. هناك الكثير الذي يمكنك تعلمه عن TensorFlow.js ولكن في هذا المقال أحببت أن أوضح أكثر المفاهيم أهمية. معظم الكودات يمكنك إيجاده في الأسفل.

المراجع

  1. https://blog.tensorflow.org/2018/04/a-gentle-introduction-to-tensorflowjs.html
  2. https://www.tensorflow.org/js/
  3. https://gist.github.com/zaidalyafeai
نشرة فهم البريدية
لتبقى على اطلاع دائم على كل ما هو جديد مما تقدمه منصة فهم، انضم لنشرتنا البريدية.
طالب دكتوراه في الذكاء الاصطناعي في جامعة الملك فهد للبترول والمعادن. ماجستير في علوم الحاسب بتخصص الذكاء الاصطناعي من جامعة الملك فهد للبترول والمعادن. بكالوريوس هندسة برمجيات من جامعة الملك فهد للبترول والمعادن