รู้เบื้องต้นเกี่ยวกับตัวแปร

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

ตัวแปร TensorFlow เป็นวิธีที่แนะนำในการแสดงสถานะที่ใช้ร่วมกันและถาวรที่โปรแกรมของคุณจัดการ คู่มือนี้ครอบคลุมถึงวิธีสร้าง อัปเดต และจัดการอินสแตนซ์ของ tf.Variable ใน TensorFlow

ตัวแปรถูกสร้างขึ้นและติดตามผ่านคลาส tf.Variable tf.Variable แสดงถึงเทนเซอร์ที่มีค่าสามารถเปลี่ยนแปลงได้โดยการเรียกใช้ ops กับมัน ปฏิบัติการเฉพาะทำให้คุณสามารถอ่านและแก้ไขค่าของเทนเซอร์นี้ได้ ไลบรารีระดับสูงเช่น 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 และรูปร่าง และสามารถส่งออกไปยัง 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.]]

การดำเนินการเทนเซอร์ส่วนใหญ่ทำงานกับตัวแปรตามที่คาดไว้ แม้ว่าตัวแปรจะไม่สามารถเปลี่ยนรูปแบบได้

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 ที่ใช้ Python อินสแตนซ์ tf.Variable มีวงจรชีวิตเหมือนกับอ็อบเจ็กต์ Python อื่นๆ เมื่อไม่มีการอ้างอิงถึงตัวแปร จะถูกจัดสรรคืนโดยอัตโนมัติ

นอกจากนี้ยังสามารถตั้งชื่อตัวแปรซึ่งสามารถช่วยคุณติดตามและแก้ไขข้อบกพร่องได้ คุณสามารถตั้งชื่อตัวแปรสองตัวให้เหมือนกันได้

# 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 คุณจะเห็นการบันทึกที่แตกต่างกัน โปรดทราบว่าต้องเปิดการบันทึกตำแหน่งอุปกรณ์เมื่อเริ่มต้นเซสชัน

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)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการฝึกอบรมแบบกระจาย โปรดดู คำแนะนำของเรา

ขั้นตอนถัดไป

เพื่อทำความเข้าใจว่าโดยทั่วไปแล้วมีการใช้ตัวแปรอย่างไร โปรดดูคำแนะนำเกี่ยวกับการสร้าง ความแตกต่างโดยอัตโนมัติ