Pengantar Variabel

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Variabel TensorFlow adalah cara yang disarankan untuk mewakili status bersama dan persisten yang dimanipulasi oleh program Anda. Panduan ini mencakup cara membuat, memperbarui, dan mengelola instance tf.Variable di TensorFlow.

Variabel dibuat dan dilacak melalui kelas tf.Variable . Sebuah tf.Variable mewakili tensor yang nilainya dapat diubah dengan menjalankan ops di atasnya. Operasi khusus memungkinkan Anda membaca dan mengubah nilai tensor ini. Pustaka tingkat yang lebih tinggi seperti tf.keras menggunakan tf.Variable untuk menyimpan parameter model.

Mempersiapkan

Buku catatan ini membahas penempatan variabel. Jika Anda ingin melihat di perangkat apa variabel Anda ditempatkan, batalkan komentar pada baris ini.

import tensorflow as tf

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

Buat variabel

Untuk membuat variabel, berikan nilai awal. tf.Variable akan memiliki dtype yang sama dengan nilai inisialisasi.

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

Variabel terlihat dan bertindak seperti tensor, dan, pada kenyataannya, adalah struktur data yang didukung oleh tf.Tensor . Seperti tensor, mereka memiliki dtype dan bentuk, dan dapat diekspor ke 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.]]

Sebagian besar operasi tensor bekerja pada variabel seperti yang diharapkan, meskipun variabel tidak dapat dibentuk kembali.

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)

Seperti disebutkan di atas, variabel didukung oleh tensor. Anda dapat menetapkan ulang tensor menggunakan tf.Variable.assign . Penetapan panggilan tidak (biasanya) assign tensor baru; sebagai gantinya, memori tensor yang ada digunakan kembali.

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

Jika Anda menggunakan variabel seperti tensor dalam operasi, Anda biasanya akan beroperasi pada backing tensor.

Membuat variabel baru dari variabel yang ada menduplikasi backing tensor. Dua variabel tidak akan berbagi memori yang sama.

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

Siklus hidup, penamaan, dan menonton

Dalam TensorFlow berbasis Python, instance tf.Variable memiliki siklus hidup yang sama dengan objek Python lainnya. Ketika tidak ada referensi ke variabel, maka secara otomatis tidak dialokasikan.

Variabel juga dapat diberi nama yang dapat membantu Anda melacak dan men-debugnya. Anda dapat memberikan dua variabel nama yang sama.

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

Nama variabel dipertahankan saat menyimpan dan memuat model. Secara default, variabel dalam model akan memperoleh nama variabel unik secara otomatis, jadi Anda tidak perlu menetapkannya sendiri kecuali Anda menginginkannya.

Meskipun variabel penting untuk diferensiasi, beberapa variabel tidak perlu dibedakan. Anda dapat menonaktifkan gradien untuk variabel dengan menyetel trainable ke false saat pembuatan. Contoh variabel yang tidak memerlukan gradien adalah penghitung langkah pelatihan.

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

Menempatkan variabel dan tensor

Untuk kinerja yang lebih baik, TensorFlow akan mencoba menempatkan tensor dan variabel pada perangkat tercepat yang kompatibel dengan dtype -nya. Ini berarti sebagian besar variabel ditempatkan pada GPU jika tersedia.

Namun, Anda dapat menimpa ini. Dalam cuplikan ini, tempatkan float tensor dan variabel pada CPU, meskipun GPU tersedia. Dengan mengaktifkan pencatatan penempatan perangkat (lihat Pengaturan ), Anda dapat melihat di mana variabel ditempatkan.

Jika Anda menjalankan notebook ini pada backend yang berbeda dengan dan tanpa GPU, Anda akan melihat logging yang berbeda. Perhatikan bahwa penempatan perangkat pencatatan harus diaktifkan pada awal sesi.

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)

Dimungkinkan untuk mengatur lokasi variabel atau tensor pada satu perangkat dan melakukan perhitungan pada perangkat lain. Ini akan menyebabkan penundaan, karena data perlu disalin antar perangkat.

Namun, Anda mungkin melakukan ini, jika Anda memiliki banyak pekerja GPU tetapi hanya menginginkan satu salinan variabel.

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)

Untuk informasi lebih lanjut tentang pelatihan terdistribusi, lihat panduan kami .

Langkah selanjutnya

Untuk memahami bagaimana variabel biasanya digunakan, lihat panduan kami tentang diferensiasi otomatis .