ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

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

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

يتم إنشاء المتغيرات وتتبعها عبر فئة tf.Variable . tf.Variable يمثل 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 وشكل ، ويمكن تصديرها إلى 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:  <bound method BaseResourceVariable.numpy of <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>>

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

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: Shapes (2,) and (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 have the same value but are 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 الخاص 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)

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

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

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