Giới thiệu về các biến

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Biến TensorFlow là cách được khuyến nghị để biểu thị trạng thái được chia sẻ, liên tục mà chương trình của bạn thao tác. Hướng dẫn này trình bày cách tạo, cập nhật và quản lý các phiên bản của tf.Variable trong TensorFlow.

Các biến được tạo và theo dõi thông qua lớp tf.Variable . Một tf.Variable đại diện cho một tensor có giá trị có thể thay đổi bằng cách chạy các hoạt động trên nó. Các hoạt động cụ thể cho phép bạn đọc và sửa đổi các giá trị của tensor này. Các thư viện cấp cao hơn như tf.keras sử dụng tf.Variable để lưu trữ các tham số của mô hình.

Thành lập

Sổ tay này thảo luận về vị trí thay đổi. Nếu bạn muốn xem các biến của bạn được đặt trên thiết bị nào, hãy bỏ ghi chú dòng này.

import tensorflow as tf

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

Tạo một biến

Để tạo một biến, hãy cung cấp một giá trị ban đầu. tf.Variable sẽ có cùng dtype với giá trị khởi tạo.

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

Một biến trông và hoạt động giống như tensor, và trên thực tế, là một cấu trúc dữ liệu được hỗ trợ bởi tf.Tensor . Giống như dtype , chúng có một loại và một hình dạng, và có thể được xuất khẩu sang 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.]]

Hầu hết các hoạt động tensor hoạt động trên các biến như mong đợi, mặc dù các biến không thể được định hình lại.

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)

Như đã lưu ý ở trên, các biến được hỗ trợ bởi tensor. Bạn có thể gán lại tensor bằng tf.Variable.assign . Gọi assign không (thường) phân bổ một tensor mới; thay vào đó, bộ nhớ của tensor hiện có được sử dụng lại.

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

Nếu bạn sử dụng một biến như tensor trong các hoạt động, bạn thường sẽ hoạt động trên tensor hỗ trợ.

Việc tạo các biến mới từ các biến hiện có sẽ nhân bản các tensor hỗ trợ. Hai biến sẽ không chia sẻ cùng một bộ nhớ.

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

Vòng đời, đặt tên và xem

Trong TensorFlow dựa trên Python, cá thể tf.Variable có cùng vòng đời với các đối tượng Python khác. Khi không có tham chiếu đến một biến, nó sẽ tự động được phân bổ.

Các biến cũng có thể được đặt tên có thể giúp bạn theo dõi và gỡ lỗi chúng. Bạn có thể đặt tên cho hai biến giống nhau.

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

Tên biến được giữ nguyên khi lưu và tải mô hình. Theo mặc định, các biến trong mô hình sẽ tự động nhận các tên biến duy nhất, vì vậy bạn không cần phải tự gán chúng trừ khi bạn muốn.

Mặc dù các biến số rất quan trọng để tạo sự khác biệt, nhưng một số biến số sẽ không cần được phân biệt. Bạn có thể tắt gradient cho một biến bằng cách đặt có trainable thành false khi tạo. Một ví dụ về một biến không cần độ dốc là bộ đếm bước huấn luyện.

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

Đặt các biến và tensor

Để có hiệu suất tốt hơn, TensorFlow sẽ cố gắng đặt các bộ căng và biến trên thiết bị nhanh nhất tương thích với loại của dtype . Điều này có nghĩa là hầu hết các biến được đặt trên GPU nếu có sẵn.

Tuy nhiên, bạn có thể ghi đè điều này. Trong đoạn mã này, hãy đặt một float tensor và một biến trên CPU, ngay cả khi có sẵn GPU. Bằng cách bật ghi nhật ký vị trí thiết bị (xem Thiết lập ), bạn có thể thấy vị trí đặt biến.

Nếu bạn chạy máy tính xách tay này trên các phần mềm phụ trợ khác nhau có và không có GPU, bạn sẽ thấy ghi nhật ký khác nhau. Lưu ý rằng vị trí thiết bị ghi nhật ký phải được bật khi bắt đầu phiê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)
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

Có thể đặt vị trí của một biến hoặc tensor trên một thiết bị và thực hiện tính toán trên thiết bị khác. Điều này sẽ gây ra sự chậm trễ, vì dữ liệu cần được sao chép giữa các thiết bị.

Tuy nhiên, bạn có thể làm điều này nếu bạn có nhiều nhân viên GPU nhưng chỉ muốn một bản sao của các biến.

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)

Để biết thêm về đào tạo phân tán, hãy xem hướng dẫn của chúng tôi .

Bước tiếp theo

Để hiểu cách các biến thường được sử dụng, hãy xem hướng dẫn của chúng tôi về phân biệt tự động .