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