ما هو TensorFlow؟

368

ما هو TensorFlow؟

تعتبر مكتبة TensorFlow التابعة لشركة Google من أشهر مكتبات التعلٌم العميق – Deep Learning في الوقت الحالي. تستخدم Google التعلم الآلي – Machine Learning في جميع منتجاتها لتحسين أداء محرك البحث أو الترجمة أو التسميات التوضيحية للصور.

يمكن استخدام TensorFlow لبناء أي بنية تعليمية عميقة, مثل CNN أو RNN أو ANN.

قام فريق TensorFlow التابع لـ Google Brain بملء الفجوة بين الباحثين والمطورين. ففي عام 2015,  حيث جعلوا TensorFlow متاح للجميع.

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

تريد Google استخدام التعلم الآلي للاستفادة من البيانات الضخمة لديها لمنح المستخدمين أفضل تجربة.

تم تصميم TensorFlow ليعمل على العديد من وحدات المعالجة المركزية (CPU) أو وحدات المعالجة الرسومية (GPU) وحتى أنظمة تشغيل الهواتف المحمولة, ومتوفرة أيضا لعدة لغات مثل Python أو ++Cأو Java.

في هذا المقال:

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

 

تاريخ TensorFlow

بدأ التعلم العميق مؤخرا بالتفوق على جميع خوارزميات تعلم الآلة الأخرى “عند توافر كمية هائلة من البيانات بالطبع”. مما دفع Google لاستخدام هذا التفوق لتحسين الشبكات العصبية العميقة لكل من:

  • Gmail.
  • محرك بحث جوجل.

تم الإعلان عن TensorFlow لأول مرة في أواخر عام 2015, بينما ظهر الإصدار الأول في عام 2017, وهو مفتوح المصدر بموجب ترخيص Apache Open Source. حيث يمكنك استخدامه وتعديله وإعادة توزيع الإصدار المعدل وبيعه “أي الإصدار المعدل” دون دفع أي شيء إلى Google.

 

أجزاء TensorFlow

يعمل Tensorflow على ثلاثة أجزاء:

  • المعالجة المسبقة للبيانات.
  • بناء النموذج.
  • تدريب واجراء التنبؤات بالنموذج.

يطلق عليه Tensorflow لأنه يستقبل المدخلات كمجموعة متعددة الأبعاد, والمعروفة أيضا باسم tensors. حيث تدخل المدخلات tensors من ناحية, ثم تتدفق خلال النظام عبر عمليات متعددة  وتخرج من ناحية آخري كمخرجات “أي ناتج”.

ولهذا يطلق عليه TensorFlow لأن tensor يدخل ثم يمر بقائمة العمليات “flow”, ثم يخرج من الجانب الآخر.

 

أين يمكن تشغيل Tensorflow؟

متطلبات تشغيل TensorFlow تختلف حسب الغرض منها, ويمكن تصنيفها لغرضين:

  1. مرحلة التطوير: عند تدريب النموذج.
  2. مرحلة التشغيل : بمجرد الانتهاء من التدريب, وأستخدام النموذج للقيام بالتنبؤات.

تستطيع تشغيل Tensorflow على كل من:

  • حاسوب مكتبي يعمل بنظام ويندوز أو ماك أو لينكس.
  • الحوسبة السحابة كخدمة على شبكة الإنترنت.
  • أجهزة محمولة مثل iOS وAndroid.

يمكنك القيام بعملية التدريب على أجهزة مختلفة, وبمجرد حصولك على النموذج المدرّب يمكنك تشغيله على جهاز مختلف أيضاً. يمكنك تدريب النموذج واستخدامه على كلاً من وحدات معالجة الرسوم (GPU) ووحدات المعالجة المركزية (CPU) بالطبع.

تٌستعمل وحدات معالجة الرسومات (GPU) لمعالجة بيانات ألعاب الفيديو, ولكن في أواخر عام 2010 وجد باحثون في جامعة ستانفورد أن وحدة معالجة الرسومية (GPU) هذه جيدة جدًا في العمليات الحسابية وعمليات الجبر و بالاخص على المصفوفة, حيث انها سريعة جدًا في القيام بهذا النوع من الحسابات. يحتوي التعلم العميق على الكثير من العمليات الحسابية على المصفوفات. و TensorFlow سريع جدا في القيام بهذه العمليات لأنه مكتوب ب ++C. و كميزة اضافية, يمكنك استعمال TensorFlow والتحكم فيه من قبل لغات أخرى كال Python.

ميزة اخري مهمة في TensorFlow هي TensorBoard. تمكنك لوحة TensorBoard من مراقبة ما يحدث اثناء التدريب وبشكل مرئي.

 

مقدمة لمكونات TensorFlow

Tensor

اسم Tensorflow مستمد مباشرة من المكون الأساسي له”Tensor”. وهو متجه أو مصفوفة متعددة الأبعاد “n” تستطيع ان تحمل جميع أنواع البيانات, وجميع القيم الموجودة في tensor تحتوي على نفس نوع البيانات.

يمكنك انشاء tensor من بيانات الإدخال أو بيانات النتيجة. وتتم جميع العمليات الحسابية داخل Graph. Graph هنا عبارة عن مجموعة من العمليات الحسابية التي تتم على التوالي. كل عملية تسمى “op node”.

لكل tensor عقدة وحافة. تحمل العقدة العملية الرياضية وتقوم بحساب النواتج النهائية. تشرح الحواف علاقات الإدخال / الإخراج بين العقُد – nodes.

Graph

TensorFlow يستخدم ال Graph . يعرض ال Graph جميع العمليات الحسابية أثناء التدريب.

يحتوي ال Graph على الكثير من المزايا:

  • تستطيع تشغيله على وحدات المعالجة المركزية (CPU) متعددة ووحدات معالجة الرسومية (GPU) متعددة أيضا, وحتى نظام تشغيل الهواتف المحمولة.
  • يعطيك القابلية بالاحتفاظ بالحسابات للاستخدام الفوري أو اللاحق. يمكنك حفظ ال Graph ليتم تنفيذه في المستقبل.
  • تتم جميع العمليات في ال Graph عن طريق ربط ال tensors ببعض معا.

 

لماذا TensorFlow ذات شعبية كبيرة؟

TensorFlow تعتبر أفضل مكتبة للتعلم العميق على الاطلاق, لأنها بُنيت لتكون في متناول الجميع. تضم مكتبة Tensorflow واجهة برمجية لتطبيقات مختلفة مثل CNN أو RNN. يعتمد TensorFlow على ال Graph؛ لأنها تسمح للمطور برؤية مراحل بناء الشبكة العصبية خلال Tensorboad. وأخيرًا, تم تصميم Tensorflow ليتم نشره على نطاق واسع. وكون أنه يعمل على كلا من وحدات المعالجة المركزية (CPU) ووحدات معالجة الرسومية (GPU) ميزة رائعه حقاً.

يحظى Tensorflow بشعبية كبيرة على GitHub مقارنة بأي إطار اخر للتعلم العميق.

 

قائمة بالخوارزميات البارزة التي يدعمها TensorFlow

يحتوي TensorFlow 1.10 على واجهة برمجية للتطبيقات تحتوي على:

Linear regression: tf.estimator.LinearRegressor
Classification:tf.estimator.LinearClassifier
Deep learning classification: tf.estimator.DNNClassifier
Deep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifier
Booster tree regression: tf.estimator.BoostedTreesRegressor
Boosted tree classification: tf.estimator.BoostedTreesClassifier

مثال بسيط TensorFlow

import numpy as np
import tensorflow as tf

استخدمنا مكتبة tensorflow ورمزنا لها بالرمز tf وذالك لتجنب كتابة الاسم بالكامل فى كل مرة نريد استدعاء المكتبة داخل الكود.

خلال هذا المثال, سنقوم بتجربة القيام بعمليه حسابية خلال Tensorflow عبر تمرير القيم X_1 وX_2 للحصول علي حاصل ضربهما. سيقوم Tensorflow بإنشاء عقدة لتمثيل عملية الضرب هذه, وعند الحصول على Graph, سيقوم Tensorflow بتفيذ العمليه.

سنقوم بانشاء عقدتي إدخال X_1 وX_2, وعندما تنُشئ عقدة في Tensorflow, يجب أن نختار نوع هذه العقدة, سوف تكون هذه عقدة من نوع placeholder.

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

الخطوة الاولي: تعريف المتغيرات

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

عندما نقوم بإنشاء عقدة من نوع placeholder, يجب أن نخبره بنوع البيانات الذي سيتم إضافتها له, فمثلا حتى نتمكن من استخدام الفاصلة للأرقام, يجب ان نمرر tf.float32. نحتاج أيضًا إلى إعطاء هذه العقدة اسمًا, سيظهر هذا الاسم عندما ننظر إلى Graph, لذلك سنستعمل خاصية “name” ونسمي كل عقدة منهم.

الخطوة الثانية: تعريف العملية الحسابية

multiply = tf.multiply(X_1, X_2, name = "multiply")

الآن يمكننا تعريف العقدة التي تقوم بعملية الضرب, في Tensorflow يمكننا القيام بذلك عن طريق إنشاء عقدة tf.multiply.

سنمرر لها العقدتين X_1 وX_2, وذلك يعني أن tensorflow سيربط تلك العقُد في Graph بهذه العقدة الحسابية, وستسحب العقدة الحسابية القيم من عقدتي الادخال وتضرب هذة القيم للحصول علي النتيجة.

الخطوة الثالثة: القيام بالعملية الحسابية

لأجراء العمليات في Graph, يتعين علينا إنشاء session, و ذلك عن طريق () tf.Session. والآن يمكننا أن نقوم بتشغيل العملية الحسابية على Graph عن طريق ()session.run.

ستلاحظ أنها تحتاج الى الحصول على قيم العقدتين X_1 وX_2, لذلك نحتاج الى اضافة القيم, وذلك عن طريق خاصية تسمى feed_dict. سنمرر القيم 1،2،3 لـ X_1 و 4،5،6 لـ X_2.

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

multiply = tf.multiply(X_1, X_2, name = "multiply")

with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)

النتيجة.

[ 4. 10. 18.]

 

الخيارات المختلفة لتحميل البيانات إلى TensorFlow

الخطوة الأولى قبل تدريب أي خوارزمية هي تحميل البيانات, هناك طريقتان معُتاداتان لتحميل البيانات:

  • تحميل البيانات إلى الذاكرة: إنها أبسط طريقة بالطبع. يمكنك تحميل جميع البيانات الى الذاكرة, وذلك غير مرتبط بـ Tensorflow.
  • تحميل البيانات خلال سلسلة عمليات Tensorflow: يحتوي Tensorflow على تطبيقات مدمجة تساعدك على تحميل البيانات, وهذه الطريقة تعمل بشكل جيد خاصة عندما يكون لديك مجموعة بيانات كبيرة. على سبيل المثال, دائما ما تكون سجلات الصور ذات حجم هائل ولا يتناسب وضعها في الذاكرة مباشرة, لذلك من خلال سلسلة عمليات Tensorflow المتوازية سيقوم بإدارة الذاكرة بشكل عملي وتحمل مسؤولية ادخال البيانات.

تحميل البيانات الى الذاكرة

إذا كانت مجموعة البيانات لديك ليست كبيرة, أي أقل من 10 غيغابايت, فلا مشكلة من تحميل البيانات مباشرة الى الذاكرة يمكنك استخدام مكتبة مشهورة تسمى Pandas لاستيراد ملفات CSV.

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

إذا كانت مجموعة البيانات لديك كبيرة, فعلى سبيل المثال, إذا كان لديك مجموعة بيانات تبلغ 50 غيغابايت, وكان جهاز الكمبيوتر يحتوي على 16 غيغابايت فقط من الذاكرة (RAM), فحينئذ سيتلف الجهاز.

في هذه الحالة, تحتاج إلى بناء سلسلة عمليات Tensorflow, سيتم تحميل البيانات على دفعات, سيتم الدفع بكل دفعة خلال سلسلة العمليات لتصبح جاهزة للدخول الى مرحلة التدريب. بناء هذة السلسلة من العمليات هو حل ممتاز لأنه يسمح لك باستخدام parallel computing (الحوسبة المتوازية), وذلك يعني أن Tensorflow سيقوم بتدريب النموذج عبر وحدات المعالجة المركزية المتعددة, مما يعود عليك بأداء أقوى بلا شك.

باختصار, إذا كان لديك مجموعة بيانات صغيرة, فيمكنك تحميل البيانات في الذاكرة مباشرة باستخدام مكتبة Pandas.

إذا كان لديك مجموعة بيانات كبيرة وكنت ترغب في الاستفادة من وحدات المعالجة المركزية المتعددة, فستكون أكثر راحة للعمل مع سلسلة عمليات Tensorflow.

 

إنشاء سلسلة عمليات Tensorflow

في المثال السابق, اضفنا ثلاث قيم لـ X_1 وX_2 يدويًا, سنرى الآن طريقة اخري لتحميل البيانات إلى Tensorflow.

الخطوة الاولي: انشاء البيانات

دعونا نستخدم مكتبة numpy لإنشاء قيمتين عشوائيتين في البداية.

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

النتيجة.

[[0.8835775 0.23766977]]

الخطوة الثانية: انشاء placeholder

كالمثال السابق, قمنا بإنشاء placeholder باسم X, نحتاج إلى تحديد شكل ال tensor, سنقوم بتحميل array بقيمتين فقط, ولذلك يمكننا استعمال خاصية “shape”.

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

الخطوة الثالثة: تعريف dataset

لتمثيل مجموعة كبيرة من البيانات يجب عليك استخدام dataset من tensorflow لتمثيل بيانات الادخال داخل سلسلة العمليات كمجموعة من العناصر (هياكل متداخلة من tensors).

dataset = tf.data.Dataset.from_tensor_slices(x)

الخطوة الرابعة: انشاء سلسلة العمليات

نحتاج إلى تهيئة سلسلة العمليات لتكون جاهزة لتتدفق البيانات عبرها, لذلك نحن بحاجة إلى إنشاء iterator (مكرر), وسنطلق عليه اسم iterator, ثم نستدعي هذا iterator للضخ بالبيانات على دفعات, هذا ما ستقوم به ()get_next. لاحظ أنه في مثالنا, هناك دفعة واحدة فقط من البيانات ذات قيمتين فقط.

iterator = dataset.make_initializable_iterator() 
get_next = iteraror.get_next()

الخطوة الخامسة: القيام بالعملية الحسابية

الخطوة الأخيرة هنا مشابهة للمثال السابق, نبدأ session ثم نقوم بتمرير بالقيمة الناتجة عن numpy لل placeholder, ثم نقوم باستدعاء()get_next لتدفق البيانات وفي النهاية لطباعة النتيجة.

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next)) # output [ 0.52374458  0.71968478]

النتيجة.

[0.8835775  0.23766978]

 

المصدر:(What is TensorFlow? Introduction, Architecture & Example)

تعليقات