مقدمه ای بر متغیرها

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

یک متغیر TensorFlow روش توصیه شده برای نمایش وضعیت مشترک و پایداری است که برنامه شما دستکاری می کند. این راهنما نحوه ایجاد، به‌روزرسانی و مدیریت نمونه‌های tf.Variable در TensorFlow را پوشش می‌دهد.

متغیرها از طریق کلاس 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:  [[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 مبتنی بر پایتون، نمونه tf.Variable چرخه حیاتی مشابه سایر اشیاء پایتون دارد. هنگامی که هیچ مرجعی به یک متغیر وجود ندارد، به طور خودکار توزیع می شود.

همچنین می‌توان متغیرهایی را نام‌گذاری کرد که به شما در ردیابی و رفع اشکال کمک می‌کنند. شما می توانید به دو متغیر هم نام بدهید.

# 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 روی false در هنگام ایجاد، می‌توانید گرادیان‌ها را برای یک متغیر خاموش کنید. نمونه ای از متغیرهایی که نیازی به گرادیان ندارند، شمارنده گام آموزشی است.

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

قرار دادن متغیرها و تانسورها

برای عملکرد بهتر، TensorFlow تلاش می‌کند تا تانسورها و متغیرها را روی سریع‌ترین دستگاه سازگار با dtype آن قرار دهد. این بدان معناست که اکثر متغیرها در صورت موجود بودن بر روی یک GPU قرار می گیرند.

با این حال، شما می توانید این را نادیده بگیرید. در این قطعه، یک تانسور شناور و یک متغیر روی CPU قرار دهید، حتی اگر یک GPU در دسترس باشد. با روشن کردن گزارش قرارگیری دستگاه (به تنظیمات مراجعه کنید)، می توانید ببینید که متغیر در کجا قرار می گیرد.

اگر این نوت بوک را در بک‌اندهای مختلف با و بدون 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)

برای اطلاعات بیشتر در مورد آموزش توزیع شده، به راهنمای ما مراجعه کنید.

مراحل بعدی

برای درک نحوه استفاده از متغیرها، به راهنمای ما در مورد تمایز خودکار مراجعه کنید.