ดูบน 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)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการฝึกอบรมแบบกระจาย โปรดดู คำแนะนำของเรา
ขั้นตอนถัดไป
เพื่อทำความเข้าใจว่าโดยทั่วไปแล้วมีการใช้ตัวแปรอย่างไร โปรดดูคำแนะนำเกี่ยวกับการสร้าง ความแตกต่างโดยอัตโนมัติ