Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Pengantar Variabel

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

Variabel TensorFlow adalah cara yang direkomendasikan untuk merepresentasikan status bersama dan persisten yang dimanipulasi oleh program Anda. Panduan ini membahas cara membuat, mengupdate, dan mengelola instance tf.Variable di TensorFlow.

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

Mempersiapkan

Notebook ini membahas penempatan variabel. Jika Anda ingin melihat pada perangkat apa variabel Anda ditempatkan, hapus tanda 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. The tf.Variable akan memiliki yang sama dtype sebagai 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])

Sebuah 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:  <bound method BaseResourceVariable.numpy of <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>>

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

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 . Memanggil assign tidak (biasanya) mengalokasikan tensor baru; sebaliknya, 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: Shapes (2,) and (3,) are incompatible

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

Membuat variabel baru dari variabel yang ada menduplikasi tensor pendukung. 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 tontonan

Dalam TensorFlow berbasis Python, instance tf.Variable memiliki siklus proses yang sama dengan objek Python lainnya. Jika tidak ada referensi ke variabel, alokasi otomatis dibatalkan.

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

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

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 membutuhkan gradien adalah penghitung langkah pelatihan.

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

Menempatkan variabel dan tensor

Untuk performa 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, kami dapat menimpanya. Dalam cuplikan ini, kita dapat menempatkan tensor float dan variabel pada CPU, meskipun GPU tersedia. Dengan mengaktifkan pencatatan penempatan perangkat (lihat Pengaturan ), kita dapat melihat di mana variabel ditempatkan.

Jika Anda menjalankan notebook ini pada backend berbeda dengan dan tanpa GPU, Anda akan melihat logging berbeda. Perhatikan bahwa penempatan perangkat logging harus dihidupkan 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)

Anda dapat menyetel lokasi variabel atau tensor di satu perangkat dan melakukan komputasi di perangkat lain. Ini akan menyebabkan penundaan, karena data perlu disalin antar perangkat.

Namun, Anda dapat melakukan ini, jika Anda memiliki beberapa 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 lebih lanjut tentang pelatihan terdistribusi, lihat panduan kami .

Langkah selanjutnya

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