หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ตัวแปรเบื้องต้น

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

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

ตัวแปรถูกสร้างและติดตามผ่านคลาส tf.Variable tf.Variable แสดงถึงเทนเซอร์ซึ่งสามารถเปลี่ยนค่าได้โดยการเรียกใช้ ops 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:  <bound method BaseResourceVariable.numpy of <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
array([[1., 2.],
       [3., 4.]], dtype=float32)>>

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

 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: Shapes (2,) and (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-based แบบ Python อินสแตนซ์ tf.Variable มีวงจรชีวิตเหมือนกับวัตถุ Python อื่น ๆ เมื่อไม่มีการอ้างอิงถึงตัวแปรมันจะถูกยกเลิกการจัดสรรโดยอัตโนมัติ

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

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

ชื่อตัวแปรจะถูกเก็บรักษาไว้เมื่อบันทึกและโหลดรุ่น ตามค่าเริ่มต้นตัวแปรในแบบจำลองจะได้รับชื่อตัวแปรที่ไม่ซ้ำกันโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องกำหนดด้วยตนเองเว้นแต่คุณต้องการ

แม้ว่าตัวแปรมีความสำคัญสำหรับการสร้างความแตกต่าง แต่ตัวแปรบางอย่างไม่จำเป็นต้องมีความแตกต่าง คุณสามารถปิดการไล่ระดับสีสำหรับตัวแปรโดยการตั้งค่า trainable เป็น false เมื่อสร้าง ตัวอย่างของตัวแปรที่ไม่ต้องการการไล่ระดับสีคือตัวนับขั้นตอนการฝึกอบรม

 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)

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

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

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