التنسورات في TensorFlow

صورة


الكائن الرئيسي الذي يتم التلاعب به في Tensorflow هو الموتر. ما هي التنسورات ، وما هي التنسورات ، وما هي الخصائص التي لديهم وكيفية معالجتها ، اقرأ دليل الترجمة من tensorflow.org.


TensorFlow ، كما يوحي الاسم ، هي عبارة عن منصة لتحديد وتنفيذ العمليات الحسابية باستخدام التنسورات. الموتر هو تعميم المتجهات والمصفوفات إلى أبعاد أعلى. داخل TensorFlow ، يتم تمثيل tensors كصفيفات n-dimensional لأنواع البيانات الأساسية.


عند كتابة برنامج TensorFlow ، فإن الكائن الرئيسي الذي تتعامل معه وتمريره هو tf.Tensor . تعمل برامج TensorFlow عن طريق إنشاء رسم بياني لكائنات tf.Tensor تفصيليًا لكيفية حساب كل مَقَيِّم استنادًا إلى tf.Tensor الأخرى المتاحة ، ثم تشغيل أجزاء من هذا الرسم البياني للحصول على نتائج الحساب.


tf.Tensor لديه الخيارات التالية:


  • نوع البيانات ( float32 أو float32 أو string ، على سبيل المثال)
  • أحجام (الشكل)

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


الأنواع الرئيسية من التنسورات هي كما يلي:


  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

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


مرتبة


ترتيب الكائن tf.Tensor هو عدد أبعادها. المرادفات من رتبة هي النظام ، ودرجة ، والبعد . لاحظ أن الترتيب في TensorFlow ليس هو نفس ترتيب المصفوفة في الرياضيات. كما يوضح الجدول التالي ، يتوافق كل ترتيب في Tensorflow مع بعض الكيانات الرياضية:


مرتبةكيان رياضي
0العددية (القيمة فقط)
1المتجه (الحجم والاتجاه)
2مصفوفة (جدول الأرقام)
33-Tensor (مكعب من الأرقام)
نn-tensor (حسنًا ، تحصل على الفكرة)

المرتبة 0


يوضح المقتطف التالي إنشاء العديد من متغيرات الرتبة 0:


 mammal = tf.Variable("Elephant", tf.string) ignition = tf.Variable(451, tf.int16) floating = tf.Variable(3.14159265359, tf.float64) its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64) 

ملاحظة: تعتبر السلسلة كائنًا فرديًا في TensorFlow ، وليست سلسلة أحرف. من الممكن أن يكون هناك عدد من الأوتار ، متجهات الصف ، إلخ.

المرتبة 1


لإنشاء كائن tf.Tensor من المرتبة 1 ، يمكنك تمرير قائمة من العناصر كقيم أولية. على سبيل المثال:


 mystr = tf.Variable(["Hello"], tf.string) cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32) first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32) its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64) 

الرتب العليا


يتكون الترتيب 2 من كائن tf.Tensor من صف واحد وعمود واحد على الأقل:


 mymat = tf.Variable([[7],[11]], tf.int16) myxor = tf.Variable([[False, True],[True, False]], tf.bool) linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32) squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32) rank_of_squares = tf.rank(squarish_squares) mymatC = tf.Variable([[7],[11]], tf.int32) 

التنسورات ذات الرتب العليا ، بالمثل ، تتكون من صفائف n-dimensional. على سبيل المثال ، عند معالجة الصور ، يتم استخدام العديد من التنسرات المرتبة 4 ، مع أبعاد تتوافق مع رقم المثال في الحزمة ، وارتفاع الصورة ، وعرض الصورة ، وقناة اللون.


 my_image = tf.zeros([10, 299, 299, 3]) #   x  x  x    

الحصول على tf.Tensor كائن tf.Tensor


لتحديد ترتيب الكائن tf.Tensor ، استدعاء الأسلوب tf.rank . على سبيل المثال ، تحدد الطريقة التالية برمجيًا ترتيب tf.Tensor المحدد أعلاه:


 r = tf.rank(my_image) #   , r   4. 

روابط لشرائح tf.Tensor


بما أن tf.Tensor عبارة عن صفيف n من الأبعاد للخلايا ، للوصول إلى خلية واحدة في tf.Tensor تحتاج إلى تحديد مؤشرات n.


بالنسبة إلى المراتب صفر (العددية) ، فهناك حاجة إلى فهارس ، لأن هذا الرقم مجرد رقم.


للحصول على الموتر الأول (الموجه) ، يمنحك تمرير فهرس واحد إمكانية الوصول إلى الرقم:


 my_scalar = my_vector[2] 

لاحظ أن الفهرس الذي تم تمريره إلى [] يمكن أن يكون بحد ذاته عددًا tf.Tensor إذا كنت تريد تحديد عنصر ديناميكيًا من متجه.


بالنسبة للتنسرات من الرتبة 2 أو أعلى ، فإن الوضع أكثر إثارة للاهتمام. بالنسبة إلى tf.Tensor المرتبة 2 ، تمرير عائد رقمين كما هو متوقع بواسطة العددية:


 my_scalar = my_matrix[1, 2] 

يؤدي تمرير رقم واحد إلى إرجاع عامل فرعي للمصفوفة كما يلي:


 my_row_vector = my_matrix[2] my_column_vector = my_matrix[:, 3] 

تدوين : في بناء الجملة ، يتم استخدام تخصيص subarray في بيثون كـ "اترك هذا البعد وحده". هذا مفيد في التنسورات عالية المستوى ، لأنه يسمح بالوصول إلى subvectors والغواصات ، وحتى subtensors الأخرى.


أبعاد


أبعاد الموتر هي عدد العناصر في كل بعد. تستخدم وثائق TensorFlow ثلاثة اصطلاحات لوصف أبعاد الموتر: المرتبة والأبعاد وعدد الأبعاد. يوضح الجدول التالي مدى ارتباطها ببعضها البعض:


مرتبةأبعادعدد القياساتمثال
0[]0-D0-D موتر. عددي.
1[D0]1-D1-D حجم الموتر [5].
2[D0 ، D1]2-Dحجم الموتر 2-D [3 ، 4].
3[D0 ، D1 ، D2]3-Dحجم الموتر ثلاثي الأبعاد [1 ، 4 ، 3].
ن[D0 ، D1 ، ... Dn-1]NDموتر الحجم [D0 ، D1 ، ... Dn-1].

يمكن تمثيل الأحجام كقوائم / مجموعات بيثون للأعداد الصحيحة ، أو باستخدام
tf.TensorShape .


الحصول على حجم الكائن tf.Tensor


هناك طريقتان للحصول على أبعاد tf.Tensor . عند إنشاء رسم بياني ، يكون من المفيد في الغالب أن نسأل ما هو معروف بالفعل عن حجم الموتر. يمكن القيام بذلك عن طريق قراءة خاصية shape للكائن tf.Tensor . هذه الطريقة تقوم بإرجاع كائن TensorShape ، وهو وسيلة ملائمة.
تمثيلات بأحجام محددة جزئيًا (لأنه عند إنشاء رسم بياني ، لا يمكن معرفة جميع الأحجام بالكامل).


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


على سبيل المثال ، يمكنك إنشاء متجه للأصفار من نفس حجم عدد أعمدة المصفوفة المحددة:


 zeros = tf.zeros(my_matrix.shape[1]) 

تغيير حجم tf.Tensor


عدد عناصر الموتر هو نتاج جميع قياساته. عدد العناصر العددية دائمًا 1 . نظرًا لأن العديد من الأحجام المختلفة يمكن أن تعطي نفس عدد العناصر ، فغالبًا ما يكون من المناسب تغيير حجم tf.Tensor دون تغيير عناصره. يمكن القيام بذلك باستخدام tf.reshape .


توضح الأمثلة التالية كيفية تغيير حجم الموتر:


 rank_three_tensor = tf.ones([3, 4, 5]) matrix = tf.reshape(rank_three_tensor, [6, 10]) #    #   6x10 matrixB = tf.reshape(matrix, [3, -1]) #     #  3x20. -1  reshape   #    . matrixAlt = tf.reshape(matrixB, [4, 3, -1]) #     #  4x3x5 # ,         #   .     #         #     . yet_another = tf.reshape(matrixAlt, [13, 2, -1]) # ERROR! 

أنواع البيانات


بالإضافة إلى البعد ، تحتوي التنسورات على نوع بيانات. لا يمكن أن tf.Tensor معين على أكثر من نوع بيانات واحد. ومع ذلك ، فمن الممكن إجراء تسلسل بنيات بيانات عشوائية في string وتخزينها في tf.Tensor .


يمكنك تحويل tf.Tensor من نوع بيانات واحد إلى آخر باستخدام tf.cast :


 #         . float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32) 

لعرض نوع بيانات tf.Tensor ، استخدم خاصية Tensor.dtype .


عند إنشاء tf.Tensor من كائن بيثون ، يمكنك اختياريا اختيار نوع البيانات. إذا لم تقم بذلك ، فسيحدد TensorFlow نوع البيانات الذي يمكن أن يمثل بياناتك. يقوم TensorFlow بتحويل أعداد بيثون الصحيحة إلى tf.int32 ، tf.int32 العائمة إلى tf.float32 . في حالات أخرى ، يستخدم TensorFlow نفس القواعد مثل numpy عند تحويل المصفوفات.


تقييم الموتر


بمجرد إنشاء الرسم البياني الحسابي ، يمكنك تشغيل حساب ذلك
سوف تولد tf.Tensor محددة واستخراج القيمة المخصصة لها. غالباً ما يكون هذا مفيدًا للتصحيح ، وكذلك بالنسبة لمعظم TensorFlow.


أسهل طريقة لتقييم Tensor هي استخدام طريقة Tensor.eval . على سبيل المثال:


 constant = tf.constant([1, 2, 3]) tensor = constant * constant print(tensor.eval()) 

طريقة eval تعمل فقط عندما يكون tf.Session الافتراضي tf.Session . إرجاع Tensor.eval صفيف numpy مع نفس محتويات كـ tensor.


في بعض الأحيان يكون من المستحيل تقييم tf.Tensor بدون سياق ، لأن قيمته قد تعتمد على معلومات ديناميكية غير متوفرة. على سبيل المثال ، لا يمكن تقييم التنسورات المعتمدة على placeholder دون توفير قيمة placeholder .


 p = tf.placeholder(tf.float32) t = p + 1.0 t.eval() #   ,   placeholder   . t.eval(feed_dict={p:2.0}) #  ,     #   placeholder. 

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


تصاميم النماذج الأخرى قد تجعل tf.Tensor أكثر صعوبة في التقييم. لا يمكن لـ TensorFlow أن يقيِّم مباشرة tf.Tensor المعرَّفة داخل الدوال أو داخل بنى تدفق التحكم. إذا كان tf.Tensor يعتمد على القيمة من قائمة الانتظار ، فلن تعمل نتيجة tf.Tensor إلا عند وضع شيء ما في قائمة الانتظار ؛ خلاف ذلك ، فإن تقدير الموتر سوف يتجمد. عند العمل مع قوائم الانتظار ، تذكر الاتصال بـ tf.train.start_queue_runners قبل تقييم أي tf.Tensor .


بعد التحقق ، ستظهر الترجمة أيضًا على Tensorflow.org. إذا كنت ترغب في المشاركة في ترجمة وثائق موقع Tensorflow.org إلى اللغة الروسية ، يرجى الاتصال في رسالة شخصية أو تعليقات. هي موضع تقدير أي تصحيحات أو تعليقات.

Source: https://habr.com/ru/post/ar484214/


All Articles