التعلم العميق وأستخداماته في الرؤية الحاسوبية - الجزء الرابع
Deep Learning For Computer Vision-Part 4
عرض موجز عن مكتبة TensorFlow:
في الشكل رقم (1) نلاحظ أنَّ الأسهم (edges ) تمثل تدفق البيانات والتي عادةً ماتكون على شكل مصفوفات متعددة الأبعاد أو (tensors), وتمثل العُقد (nodes ) العمليات الحسابية التي تجرى على هذه البيانات.وبهذا التمثيل يعبر عن البيانات بأنها سيل من التينسورات ومن هنا تمت تسمية هذه المكتبة بهذا الإسم (TensorFlow).
الشكل رقم (2) يبين بعض ماتظهره لنا أداة ال TensorBoard.
ماهو التينسر What is the Tensor ?:
تنصيب مكتبة TensorFlow.
أفضل طريقة مجربة لتنصيب هذه المكتبة هي كالآتي:
1 - نقوم بتنصيب برنامج Anaconda حيث نقوم بتحميل البرنامج من الموقع الرسمي:
(https://www.anaconda.com/ ) حيث نختار (Anaconda Distribution) ثم (windows) أو أي نظام تشغيل آخر ثم نختار (Python 3.7 version).
ملاحظة: إنَّ عملية التنصيب تأخذ بعض الوقت لأن هذا البرنامج يحتوي على حزمة كبيرة جداً من المكتبات
المفيدة.
2 – نقوم بإنشاء بيئة جديدة خاصة بمتطلباتنا لأن البيئة الأصلية التي تسمى (base) تحتوي على عدد كبير جداً من المكتبات لسنا بحاجة إلى أغلبها, وكذلك نلجأ إلى إنشاء البيئة الجديدة لكي لاتتضرر البيئة الأصلية عند حدوث سوء إستخدام من قبلنا, كذلك تفيد في حالة وجود أكثر من مستخدم للحاسوب.
هناك طريقتان لإنشاء بيئة جديدة هما:
الطريقة الأولى
نقوم بتشغيل سطر الأوامر الخاص بهذا البرنامج أي (Anaconda Prompt). ثم نكتب أمر إنشاء بيئة جديدة وكما موضح في الشكل رقم (3) أدناه:
علماً إنَّ (alfa) هنا إسم للبيئة الجديدة تستطيع إستبداله بأي إسم تختاره.
بعد تنفيذ هذا الأمر تبدأ عملية إنشاء البيئة الجديدة (alfa) وتبدأ عملية تحميل وتنصيب برنامج بايثون (Python Interpreter), وكذلك تنصيب مكتبات مهمة بما فيها مكتبة (Tensorflow), وقد إخترنا في الأمر أعلاه مكتبة (Tensorflow) نوع (CPU) ويمكن تغيير هذه العبارة إلى (tensorflow-gpu) لمن يمتلك حاسوب مجهز بلوحة شاشة نوع (NVIDIA) مخصص للألعاب عالية المستوى.
بعد إتمام العملية بنجاح ننتقل إلى البيئة الجديدة عن طريق كتابة الأمر التالي:
وللتأكد من تنصيب مكتبة (tensorflow) نقوم بكتابة كلمة (python) وكما في الصورة أدناه:
بعدها نقوم بكتابة الأمر التالي:
وأخيراً نكتب الأمر التالي وننفذه فنحصل على مايلي:
الطريقة الثانية
نقوم بتشغيل واجهة البرنامج والتي تسمى (Anaconda Navigator).
بعد أن يكتمل تشغيل Anaconda Navigator نقوم بالضغط على أيقونة ال Environments فتظهر لنا الواجهة التالية كما في الشكل رقم (4):
بعد أن نضغط على زر (create) يظهر لنا مستطيل كما في الشكل رقم (5) التالي:
بعد أن نقوم بالضغط على الزر (create) سوف يقوم البرنامج بإنشاء البيئة الجديدة ويقوم بتحميل الأدوات والمكتبات الضرورية.وبعد أن تكتمل عملية التحميل نشاهد تحت خانة (installed) مجموعة من البرامج والأدوات من ضمنها مثلاً (python 3.76) وكذلك أداة (pip) الضرورية بعمليات التنصيب التي يتم الإيعاز لها من خلال سطر الأوامر (cmd).
3 - إضافة بعض المكتبات الضرورية:
يتم ذلك من خلال الذهاب إلى خانة (installed) وتغييرها إلى (Not installed) , حيث تظهر لنا عدد كبير من المكتبات المتاحة من ضمنها مكتبة (TensorFlow), وطريقة إختيار أي مكتبة لأجل إضافتها هو بالذهاب الى حقل (Search Packages) وكتابة جزء من إسم المكتبة المطلوبة وسوف يظهر لنا إسم المكتبة مع مكتبات أخرى, فما علينا إلاّ إختيار المكتبة المطلوبة ثم نضغط على الزر الأخضر (Apply), فيظهر لنا مربع وبعد فترة تظهر في هذا المربع الحزمة الكاملة لهذه المكتبة, نضغط على زر (Apply) الموجود في هذا المربع وكما في الشكل (6) حيث إخترنا مكتبة (tensorflow).
ننتظر بعض الوقت حتى تتم العملية بإضافة هذه المكتبة ومتعلقاتها, ثم نكرر العملية إلى أن نقوم بإضافة المكتبات الضرورية في عملنا مثل مكتبة (matplotlab) أو مكتبة (opencv) أو (scikit-image) أو (scikit-learn) وغير ذلك من المكتبات.
نقوم بعدها بعملية تنصيب للبرنامجين (jupyter) و (spyder) كمنصتي عمل مهمتين في كتابة الأكواد الخاصة بتطبيقاتنا وتنفيذها. حيث إنَّ عملية تنصيبهما تتم أيضاً عبر واجهة البيئة الجديدة التي أنشأناها.
نقوم بالضغط على زر (Home) الموجود في أعلى اليسار من الواجهة, بعدها نقوم بعملية التنصيب لكل واحد من البرنامجين وذلك بالضغط على زر (install) وكما موضح في الشكل (7) أدناه:
4 - تأسيس مسار خاص بالبايثون في المسار الرئيسي للحاسوب وحسب الخطوتين التاليتين:
a - التعرف على مسار البيئة الجديدة التي قمنا بإنشاءها لأجل نسخ هذا المسار وإضافته في المكان المطلوب في المسار الرئيسي للحاسوب لاحقاً.ولأجل إكتشاف هذا المسار نضع الماوس على البيئة الجديدة التي قمنا بإنشاءها وسوف يظهر لنا بوضوح, وكما في الشكل (8) أدناه:
ملاحظة: هذا المسار من الممكن أن يتغير من حاسوب إلى آخر.
b – الذهاب الى المسار الرئيسي للحاسوب وذلك بكتابة كلمة (env) في البحث في نظام الويندوز. حيث يظهر مربع (System properties) حيث نضغط على (Environment Variables), فإذا ظهر المربع الجديد نذهب إلى الأزرار السفلى ونضغط على زر (New) فيظهر لنا مستطيل نكتب في الحقل الأول إسم المسار الخاص بالبايثون وليكن (PYTHON_PATH) مثلاً, ونكتب في الحقل الأسفل المسار الخاص بالبيئة الجديدة, ثم نضغط زر (ok) وكما موضح في الشكل (9) أدناه:
بعدها نؤشر على سطر (path) في المجموعة السفلى أيضاً ونضغط على زر (Edit) فيظهر لنا مربع
جديد هو (Edit environment variable) حيث نضغط على الزر (New) ونكتب في الحقل الجديد عبارة (%PYTHON_PATH%) كما الشكل (10) أدناه:
ثم نقوم بالضغط على الزر (ok), ثم (ok) ثم (ok) ثالثة , وبهذا نكون قد إنتهينا من إضافة مسار البايثون إلى مسارات الحاسوب الرئيسية.
من المفيد جداً أن نقوم بإضافة مسار المجلد (Scripts) الذي توجد فيه الأداة (pip), وكذلك مسار المجلد الذي توجد فيه الأداة (tensorboard) وهو (site-packages) والذي هو موجود في المجلد (Lib).ويتم ذلك عن طريق الذهاب الى المسار الرئيسي للحاسوب (Environment Variables) ونقوم بتأشير مسار البايثون الذي قمنا بإنشائه ونضغط زر ال (Edit) فيظهر لنا مربع نقوم بالضغط على (New) ونضيف المسار الأول ثم (New) مرة أخرى ونضيف المسار الثاني ثم (Ok).
5 - إضافة مسار البايثون إلى بيئة العمل :
لقد إخترنا برنامج (PyCharm) ليشكل بيئة العمل التي سوف نقوم من خلالها بإنشاء وتنفيذ تطبيقاتنا الحالية والقادمة إن شاء ألله.
قمنا أولاً بتنصيب برنامج (PyCharm) حيث إخترنا النسخة (COMMUNITY 2019.1) وبعد إكتمال التنصيب قمنا بإنشاء مشروع, ولأجل إضافة مسار البايثون الذي قمنا بتنصيبه من خلال برنامج (Anaconda) وبالتحديد البيئة الجديدة التي أنشأناها نقوم بمايلي:
نذهب الى (File) نختار (Settings), ثم نضغط على إسم المشروع الذي أنشأناه ثم (Project Interpreter),
ثم نضغط على الزر الموجود في يمين الجهة العلوية وسوف يظهر لنا إختياران هما (Add & Show All) نختار الثاني (Add) وكما موضح في الشكل (11) التالي:
فتظهر لنا واجهة جديدة. نقوم بما يلزم كما موضح بالشكلين (12) و (13) التاليين:
علماً إنَّ البيئة الجديدة التي انشأناها قد توجد في المسار التالي:
(C:\Users\user-name\Anaconda3\envs\alfa\python.exe)
وأخيراً نضغط (Ok) فتظهر لنا جميع المكتبات التي أضفناها في بيئة (Anaconda) الجديدة, وكما موضح بالشكل (14) أدناه:
ثم نضغط (Ok) فتتم عملية إضافة مفسر (Python) وكذلك جميع المكتبات التي إضفناها من بيئة (Anaconda) إلى بيئة (PyCharm).
ملاحظة:
إذا أردنا إضافة مكتبة جديدة فيمكننا الذهاب إلى بيئة (Anaconda) الجديدة وإضافة المكتبة من هناك, وكذلك يمكننا إضافتها من بيئة (PyCharm) عن طريق الواجهة الموجودة في الشكل (14), ولكن أنا أفضل الطريقة الأولى لأنها مجربة وتعتبر حلاً لكل مشاكل التنصيب والإضافة للمكتبات, كذلك يمكن الإستفادة منها في بيئات عمل أخرى مثل (Spyder) و (Jupyter) و (Eclipse).
شرح الكود:
السطر رقم (1): إستدعاء مكتبة (TensorFlow).
السطر رقم (3): الإعلان عن ثابت وسميناه (name) عن طريق إستدعاء الدالة (constant) وإعطائها الثابت المطلوب وهنا هو عبارة عن إسم مع ملاحظة إننا وضعناه داخل علامتي تنصيص بإعتباره نص.
السطر رقم (4): إستخدمنا الدالة (print) العائدة إلى مكتبة (Tensorflow) لإظهار النص, وهي تختلف عن دالة (print) العائدة إلى لغة (Python).
في هذا المثال نقوم بتعريف ثابتين عبارة عن متجهين (Two vectors), ثم نقوم بإجراء عملية جمع لهما ثم طباعة الناتج, وقد قمنا بإنشاء دالة سميناها (my_function) تقوم بعملية الجمع لهذين المتجهين ثم تقوم بطباعة النتيجة. وقد سبقنا كتابة الدالة بعبارة (@tf.function) لأجل تحويل العمليات الحسابية (Operations) إلى رسوم (Graphs) حيث تكون أسرع في التنفيذ. والكود الخاص بهذا المثال موضح في الشكل رقم (16) أدناه:
شرح الكود:
السطران (1) و (2): للإعلان عن متجهين من نوع (Tensor) هما (tensor1 and tensor2).
السطر رقم (3): هذه العبارة ضرورية قبل كتابة أي دالة تستخدم عمليات (Operations) لتحويلها إلى رسوم
(Graphs) لأجل التسريع بالحسابات (Computations).
الأسطر من (4) لغاية (7): لإنشاء الدالة التي تقوم بعملية جمع المتجهين ووضعهما في متجه جديد ثم عرض هذا المتجه الجديد (tensor).
السطر رقم (9): إستدعاء الدالة (my_function) وتمرير المتجهان المراد جمعهما وعرض نتيجة الجمع.
إنَّ المتغيرات في مكتبة (TensorFlow) تعتبر أفضل طريقة لتمثيل الحالة المستدامة والمشتركة للعناصر في البرنامج والتي يمكن تحديثها خلال عملية التدريب. وللإعلان عن المتغير نستخدم الكلاس (tf.Variable).
وتستخدم هذا النوع من المتغيرات لعناصر النموذج الخاضعة للتحديث إثناء عملية التدريب مثل الأوزان (Weights) وكذلك قيم الإنحياز (Biases).
والشكل رقم (17) التالي يبين الكود لهذا المثال:
شرح الكود:
السطر رقم (3): للإعلان عن مصفوفة (my_variable) ذات ثلاثة أبعاد تحتوي على صفوف عدد (2) وأعمدة عدد (3) وعمق (deepth) عدد (1), وإنَّ جميع قيم عناصرها هو (0).
السطر رقم (2): إستدعاء الدالة (tf.print) لأجل عرض المتغير.
في هذا المثال نقوم بالتعرف على العلاقة بين مكتبة (tensorflow) ومكتبة (numpy) حيث نقوم بتحويل بيانات على شكل مصفوفة نوع (numpy) الى (tensor) من خلال الدالة (convert_to_tensor()), حيث نقوم أولاً بالإعلان عن مصفوفة نوع (numpy) عن طريق الدالة (np.array) بعدها نقوم بتحويلها إلى مصفوفة من نوع (Tensorflow).والكود موضح بالشكل رقم (18) أدناه:
وبعد أن تعرفنا بشكل موجز عن بعض إمكانيات مكتبة (tensorflow), دعونا نشرع الآن بإنشاء شبكة عصبية إصطناعية (ANN) بإستخدام هذه المكتبة.
إنشاء شبكة (ANN) تقوم مقام البوابة المنطقية (EXCLUSIVE_OR)
السطران رقم (1) و (2): لإستدعاء المكتبتان (Tensorflow) و (Numpy).
السطر رقم (1): إنشاء البيانات الخاصة بتدريب النموذج, وهي عبارة عن مصفوفة نوع (numpy). وقد إخترنا البيانات من نوع (float32) لأننا بحاجة إلى هذا النوع من البيانات عند حسابات القيمة الخارجة وكذلك في عملية تحديث الأوزان.
السطر رقم (2): إنشاء البيانات الخاصة بالتسميات (Labels) لغرض التدريب.
الأسطر من (1) لغاية (4): إنشاء دالة لحساب قيمة الفقد (Loss) أو الكلفة (Cost).
السطر رقم (2): إختيار الخوارزمية المناسبة لحساب قيمة الفقد عن طريق الكلاس (MeanSquaredError).
السطر رقم (3): تمرير قيمة الإخراج للنموذج (pred_y) وكذلك قيمة التسمية (Label) إلى الخوارزمية.
الأسطر من (1) لغاية (15): لإنشاء المصفوفات الخاصة بمعاملات النموذج (Parameters) وهي العناصر التي يجب تحديث قيم عناصرها إثناء عملية التدريب وهي الأوزان (Weights) و كذلك قيم الإنحياز (Biases).
وقد جعلناها قابلة للتحديث من خلال الخاصية (trainable).
السطر رقم (1): لإختيار خوارزمية التحسين (Optimization) والتي تعمل على إجراء عمليات التحديث على عناصر النموذج (Model parameters). وقد إخترنا الخوارزمية نوع (Adam), وقد إخترنا معدل التعليم (Learning rate) ليكون (0.1).
السطر رقم (1): إضافة العبارة (@tf.function) التي تسبق الدالة الخاصة بتدريب النموذج, حيث إنَّ الغاية من ذلك هي تقليل الزمن اللازم للتدريب وذلك بإستخدام خاصية الرسوم (Graphs) في تنفيذ العمليات الحسابية وبالتالي تكون العملية أسرع. إن الإصدار الثاني من مكتبة (Tensorflow) يستخدم خاصية (Eager Excution)
وفيها يتم تنفيذ العمليات (Operations) المختلفة بشكل مباشر ودون تحوليها إلى رسوم (Graphs).
الأسطر من (2) لغاية (11): لإنشاء دالة تقوم بعملية التدريب (Training) للنموذج (Model).
السطر رقم (3): إستدعاء الكلاس (GradientTape) وأخذ نسخة منه سميناها (tape). حيث إنه يعمل وكأنه شريط تسجيل يحتفظ بالعمليات الحسابية التي تحدث داخله لأجل إستدعائها في عملية حساب الميل أو المشتقة (Gradient) ومن ثم إجراء عمليات التحديث على الأوزان من خلال تقنية (Back Propagation) أي الإنتشار الخلفي.
السطر رقم (4) وكذلك السطر رقم (5): حساب القيمة الخارجة من الطبقة المخفية الأولى (Hidden layer).
السطر رقم (6) وكذلك السطر رقم (7): حساب القيمة الخارجة من النموذج.
السطر رقم (8): إستدعاء الدالة (loss) التي تقوم بحساب قيمة الفقد (Loss value) وتمرير قيمتين لها هما القيمة الخارجة من النموذج (pred_y) وكذلك قيمة التسمية (real_y) والتي هي (y_train).
السطر رقم (9): القيام بحساب المشتقات (dy/dx) لقيمة الفقد (reg_loss) بالنسبة إلى كل من (w1, b1, w2, b2).
السطر رقم (10): للقيام بعملية التحديث لعناصر النموذج.
السطر رقم (1): إنشاء حلقة تكرارية لتكرار عملية التحديث بإستخدام نفس البيانات.
السطر رقم (2): إستدعاء الدالة (step) التي تقوم بعملية التدريب وتمرير بيانات التدريب لها.
السطر رقم (3): طباعة قيم المتجه (Vector) الخارج من النموذج بعد آخر دفعة تدريب.
وبعد تنفيذ التطبيق حصلنا على القيم المينة أعلاه أسفل الكود, حيث إنها قريبة جداً من قيم بيانات الإدخال (x_train).
تعليقات
إرسال تعليق