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

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

ดูใน 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: 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 ที่ใช้ tf.Variable อินสแตนซ์ 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)

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

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

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