روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

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

مشاهده در 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 و یک شکل، و می تواند به نامپای صادر می شود.

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

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

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

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

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

اگر این نوت بوک را روی پشتیبان های مختلف با و بدون GPU اجرا کنید ، logging متفاوتی را مشاهده خواهید کرد. توجه داشته باشید که قرار دادن دستگاه ورود به سیستم باید در ابتدای جلسه روشن شود.

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)

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

مراحل بعدی

برای درک اینکه چگونه متغیرهای معمولا استفاده می شود، راهنمای ما در دیدن تمایز اتوماتیک .