مقدمة في المتغيرات

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

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

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

يثبت

يناقش هذا دفتر الملاحظات التنسيب المتغير. إذا كنت تريد معرفة الجهاز الذي يتم وضع متغيراتك فيه ، فقم بإلغاء التعليق على هذا السطر.

import tensorflow as tf

# Uncomment to see where your variables get placed (see below)
# tf.debugging.set_log_device_placement(True)

قم بإنشاء متغير

لإنشاء متغير ، قم بتوفير قيمة أولية. سيكون tf.Variable dtype نفس النوع مثل قيمة التهيئة.

my_tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
my_variable = tf.Variable(my_tensor)

# Variables can be all kinds of types, just like tensors
bool_variable = tf.Variable([False, False, False, True])
complex_variable = tf.Variable([5 + 4j, 6 + 1j])

المتغير يبدو ويعمل مثل موتر ، وفي الواقع ، هو بنية بيانات مدعومة بواسطة tf.Tensor . مثل dtype ، لديهم نوع dtype وشكل ، ويمكن تصديرها إلى NumPy.

print("Shape: ", my_variable.shape)
print("DType: ", my_variable.dtype)
print("As NumPy: ", my_variable.numpy())
Shape:  (2, 2)
DType:  <dtype: 'float32'>
As NumPy:  [[1. 2.]
 [3. 4.]]

تعمل معظم عمليات الموتر على المتغيرات كما هو متوقع ، على الرغم من أنه لا يمكن إعادة تشكيل المتغيرات.

print("A variable:", my_variable)
print("\nViewed as a tensor:", tf.convert_to_tensor(my_variable))
print("\nIndex of highest value:", tf.argmax(my_variable))

# This creates a new tensor; it does not reshape the variable.
print("\nCopying and reshaping: ", tf.reshape(my_variable, [1,4]))
A variable: <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>

Viewed as a tensor: tf.Tensor(
[[1. 2.]
 [3. 4.]], shape=(2, 2), dtype=float32)

Index of highest value: tf.Tensor([1 1], shape=(2,), dtype=int64)

Copying and reshaping:  tf.Tensor([[1. 2. 3. 4.]], shape=(1, 4), dtype=float32)

كما هو مذكور أعلاه ، المتغيرات مدعومة بالموترات. يمكنك إعادة تعيين الموتر باستخدام tf.Variable.assign . assign الاستدعاء لا (عادةً) يخصص موترًا جديدًا ؛ بدلاً من ذلك ، يتم إعادة استخدام ذاكرة الموتر الموجودة.

a = tf.Variable([2.0, 3.0])
# This will keep the same dtype, float32
a.assign([1, 2]) 
# Not allowed as it resizes the variable: 
try:
  a.assign([1.0, 2.0, 3.0])
except Exception as e:
  print(f"{type(e).__name__}: {e}")
ValueError: Cannot assign to variable Variable:0 due to variable shape (2,) and value shape (3,) are incompatible

إذا كنت تستخدم متغيرًا مثل موتر في العمليات ، فستعمل عادةً على موتر الدعم.

يؤدي إنشاء متغيرات جديدة من المتغيرات الحالية إلى تكرار الموترات الداعمة. لن يشترك متغيرين في نفس الذاكرة.

a = tf.Variable([2.0, 3.0])
# Create b based on the value of a
b = tf.Variable(a)
a.assign([5, 6])

# a and b are different
print(a.numpy())
print(b.numpy())

# There are other versions of assign
print(a.assign_add([2,3]).numpy())  # [7. 9.]
print(a.assign_sub([7,9]).numpy())  # [0. 0.]
[5. 6.]
[2. 3.]
[7. 9.]
[0. 0.]

دورات الحياة والتسمية والمراقبة

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

يمكن أيضًا تسمية المتغيرات التي يمكن أن تساعدك على تتبعها وتصحيحها. يمكنك إعطاء متغيرين نفس الاسم.

# Create a and b; they will have the same name but will be backed by
# different tensors.
a = tf.Variable(my_tensor, name="Mark")
# A new variable with the same name, but different value
# Note that the scalar add is broadcast
b = tf.Variable(my_tensor + 1, name="Mark")

# These are elementwise-unequal, despite having the same name
print(a == b)
tf.Tensor(
[[False False]
 [False False]], shape=(2, 2), dtype=bool)

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

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

step_counter = tf.Variable(1, trainable=False)

وضع المتغيرات والموتر

للحصول على أداء أفضل ، سيحاول TensorFlow وضع موترات ومتغيرات على أسرع جهاز متوافق مع dtype الخاص به. هذا يعني أن معظم المتغيرات يتم وضعها في وحدة معالجة الرسومات (GPU) في حالة توفرها.

ومع ذلك ، يمكنك تجاوز هذا. في هذا المقتطف ، ضع موترًا عائمًا ومتغيرًا على وحدة المعالجة المركزية ، حتى لو كانت وحدة معالجة الرسومات متاحة. من خلال تشغيل تسجيل موضع الجهاز (انظر الإعداد ) ، يمكنك معرفة مكان وضع المتغير.

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

with tf.device('CPU:0'):

  # Create some tensors
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
  c = tf.matmul(a, b)

print(c)
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

من الممكن تعيين موقع متغير أو موتر على جهاز واحد والقيام بالحسابات على جهاز آخر. سيؤدي هذا إلى حدوث تأخير ، حيث يجب نسخ البيانات بين الأجهزة.

ومع ذلك ، يمكنك القيام بذلك إذا كان لديك عدة عمال GPU لكنك تريد نسخة واحدة فقط من المتغيرات.

with tf.device('CPU:0'):
  a = tf.Variable([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.Variable([[1.0, 2.0, 3.0]])

with tf.device('GPU:0'):
  # Element-wise multiply
  k = a * b

print(k)
tf.Tensor(
[[ 1.  4.  9.]
 [ 4. 10. 18.]], shape=(2, 3), dtype=float32)

لمزيد من المعلومات حول التدريب الموزع ، راجع دليلنا .

الخطوات التالية

لفهم كيفية استخدام المتغيرات عادةً ، راجع دليلنا حول التفاضل التلقائي .