ML Community Day คือวันที่ 9 พฤศจิกายน! ร่วมกับเราสำหรับการปรับปรุงจาก TensorFlow, JAX และอื่น ๆ เรียนรู้เพิ่มเติม

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

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

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

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

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

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

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

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

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