Değişkenlere Giriş

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Bir TensorFlow değişkeni , programınızın manipüle ettiği paylaşılan, kalıcı durumu temsil etmenin önerilen yoludur. Bu kılavuz, tf.Variable örneklerinin nasıl oluşturulacağını, güncelleneceğini ve yönetileceğini kapsar.

Değişkenler tf.Variable sınıfı aracılığıyla oluşturulur ve izlenir. Bir tf.Variable , üzerinde ops çalıştırılarak değeri değiştirilebilen bir tensörü temsil eder. Belirli işlemler, bu tensörün değerlerini okumanıza ve değiştirmenize izin verir. tf.Variable gibi daha yüksek seviyeli kitaplıklar, model parametrelerini depolamak için tf.keras kullanır.

Kurmak

Bu not defterinde değişken yerleşim anlatılmaktadır. Değişkenlerinizin hangi cihaza yerleştirildiğini görmek istiyorsanız, bu satırın yorumunu kaldırın.

import tensorflow as tf

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

Değişken oluştur

Bir değişken oluşturmak için bir başlangıç ​​değeri sağlayın. tf.Variable , başlatma değeriyle aynı dtype sahip olacaktır.

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])

Bir değişken, bir tensör gibi görünür ve hareket eder ve aslında, bir tf.Tensor tarafından desteklenen bir veri yapısıdır. Tensörler gibi, bir türü ve şekli vardır ve dtype aktarılabilirler.

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

Çoğu tensör işlemi değişkenler üzerinde beklendiği gibi çalışır, ancak değişkenler yeniden şekillendirilemez.

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]))
tutucu5 l10n-yer
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)

Yukarıda belirtildiği gibi, değişkenler tensörler tarafından desteklenir. tf.Variable.assign kullanarak tensörü yeniden atayabilirsiniz. assign çağırmak (genellikle) yeni bir tensör tahsis etmez; bunun yerine, mevcut tensörün belleği yeniden kullanılır.

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}")
tutucu7 l10n-yer
ValueError: Cannot assign to variable Variable:0 due to variable shape (2,) and value shape (3,) are incompatible

İşlemlerde tensör gibi bir değişken kullanırsanız, genellikle destek tensörü üzerinde işlem yaparsınız.

Mevcut değişkenlerden yeni değişkenler oluşturmak, destek tensörlerini çoğaltır. İki değişken aynı belleği paylaşmaz.

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.]
tutucu9 l10n-yer
[5. 6.]
[2. 3.]
[7. 9.]
[0. 0.]

Yaşam döngüleri, adlandırma ve izleme

Python tabanlı TensorFlow'da tf.Variable örneği, diğer Python nesneleriyle aynı yaşam döngüsüne sahiptir. Bir değişkene referans olmadığında, otomatik olarak serbest bırakılır.

Değişkenler, onları izlemenize ve hatalarını ayıklamanıza yardımcı olabilecek şekilde adlandırılabilir. Aynı ismi iki değişkene verebilirsiniz.

# 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)
tutucu11 l10n-yer
tf.Tensor(
[[False False]
 [False False]], shape=(2, 2), dtype=bool)

Modeller kaydedilirken ve yüklenirken değişken adları korunur. Varsayılan olarak, modellerdeki değişkenler otomatik olarak benzersiz değişken adları alacaktır, bu nedenle istemediğiniz sürece bunları kendiniz atamanız gerekmez.

Değişkenler farklılaşma için önemli olsa da, bazı değişkenlerin farklılaştırılması gerekmeyecektir. Oluşturma sırasında trainable ayarını false olarak ayarlayarak bir değişken için degradeleri kapatabilirsiniz. Degradelere ihtiyaç duymayan bir değişken örneği, bir eğitim adım sayacıdır.

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

Değişkenleri ve tensörleri yerleştirme

Daha iyi performans için TensorFlow, tensörleri ve değişkenleri dtype ile uyumlu en hızlı cihaza yerleştirmeye çalışacaktır. Bu, varsa çoğu değişkenin bir GPU'ya yerleştirildiği anlamına gelir.

Ancak, bunu geçersiz kılabilirsiniz. Bu pasajda, bir GPU mevcut olsa bile CPU'ya bir kayan tensör ve bir değişken yerleştirin. Cihaz yerleşimi günlüğünü açarak (bkz. Kurulum ), değişkenin nereye yerleştirildiğini görebilirsiniz.

Bu not defterini GPU'lu ve GPU'suz farklı arka uçlarda çalıştırırsanız, farklı günlük kaydı görürsünüz. Oturumun başında kayıt cihazı yerleştirmenin açık olması gerektiğini unutmayın.

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)
tutucu14 l10n-yer
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Bir cihazda bir değişkenin veya tensörün konumunu ayarlamak ve hesaplamayı başka bir cihazda yapmak mümkündür. Bu, verilerin cihazlar arasında kopyalanması gerektiğinden gecikmeye neden olacaktır.

Bununla birlikte, birden fazla GPU çalışanınız varsa ancak değişkenlerin yalnızca bir kopyasını istiyorsanız bunu yapabilirsiniz.

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)
tutucu16 l10n-yer
tf.Tensor(
[[ 1.  4.  9.]
 [ 4. 10. 18.]], shape=(2, 3), dtype=float32)

Dağıtılmış eğitim hakkında daha fazla bilgi için kılavuzumuza bakın.

Sonraki adımlar

Değişkenlerin tipik olarak nasıl kullanıldığını anlamak için otomatik farklılaşma kılavuzumuza bakın.