Tensor ใน TensorFlow คืออะไร? รูปร่าง ประเภท และ... Operaโปร

⚡ สรุปอย่างชาญฉลาด

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

  • 🔘 คุณสมบัติสามประการ: อ็อบเจ็กต์ tf.Tensor แต่ละตัวจะมีชื่อเฉพาะ รูปร่าง และชนิดข้อมูลที่ไม่ซ้ำกัน
  • ☑️ เทนเซอร์มีสี่ประเภท: tf.constant, tf.Variable, tf.placeholder และ tf.SparseTensor ครอบคลุม API แบบคลาสสิก
  • ลำดับชั้นเท่ากับการซ้อนกัน: วงเล็บแต่ละคู่ที่เพิ่มเข้ามาจะเพิ่มมิติหนึ่งให้กับคู่รูปทรง
  • 🧪 การประเมินผลล่าช้า: การพิมพ์คำสั่งจะแสดงคำจำกัดความของคำสั่งนั้น ไม่ใช่ค่าของคำสั่งนั้น จนกว่าจะมีการเรียกใช้คำสั่งนั้นในเซสชันจริง
  • 🛠️ กราฟและช่วงเวลา: กราฟจะเก็บการดำเนินการต่างๆ ในขณะที่เซสชันทำการประมวลผลและส่งคืนผลลัพธ์
  • ⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: เซสชันและตัวยึดตำแหน่งเป็นส่วนหนึ่งของ TensorFlow 1.x และอยู่ใน tf.compat.v1 ในปัจจุบัน

พื้นฐานของ TensorFlow: Tensor, Shape, Type, Sessions และ Operaโปร

เทนเซอร์คืออะไร?

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

เทนเซอร์สามารถเกิดขึ้นได้จากข้อมูลอินพุตหรือจากผลลัพธ์ของการคำนวณ ใน TensorFlow การดำเนินการทั้งหมดจะเกิดขึ้นภายในกราฟ กราฟคือชุดของการคำนวณที่เกิดขึ้นต่อเนื่องกัน การดำเนินการแต่ละครั้งเรียกว่าโหนด op และโหนดเหล่านี้เชื่อมต่อกัน

กราฟแสดงโครงร่างของการดำเนินการและการเชื่อมต่อระหว่างโหนดต่างๆ อย่างไรก็ตาม กราฟไม่ได้แสดงค่าต่างๆ เส้นเชื่อมระหว่างโหนดคือเทนเซอร์ กล่าวคือ วิธีการเติมข้อมูลลงในการดำเนินการนั้น

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

การเป็นตัวแทนของเทนเซอร์

ใน TensorFlow เทนเซอร์คือชุดของเวกเตอร์คุณลักษณะ (เช่น อาร์เรย์) ที่มีมิติ n ตัวอย่างเช่น หากเรามีเมทริกซ์ 2×3 ที่มีค่าตั้งแต่ 1 ถึง 6 เราจะเขียนมันในรูปแบบเมทริกซ์ที่แสดงด้านล่าง:

เมทริกซ์ขนาด 2x3 ที่เก็บค่าตั้งแต่หนึ่งถึงหกในรูปแบบวงเล็บ

TensorFlow แสดงถึงเมทริกซ์นี้เป็น:

[[1, 2, 3], 
   [4, 5, 6]]

ถ้าเราสร้างเมทริกซ์สามมิติที่มีค่าตั้งแต่ 1 ถึง 8 ข้อมูลเดียวกันนั้นจะถูกวาดออกมาเป็นกล่องที่มีสองด้านซ้อนกัน:

เทนเซอร์สามมิติที่วาดเป็นรูปกล่อง โดยมีค่าตั้งแต่หนึ่งถึงแปดอยู่บนหน้าสองด้านที่ซ้อนกัน

TensorFlow แสดงถึงเมทริกซ์นี้เป็น:

[ [[1, 2],  
       [[3, 4],  
       [[5, 6],  
       [[7,8] ]

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

ประเภทของเทนเซอร์

ใน TensorFlow การคำนวณทั้งหมดจะผ่านเทนเซอร์อย่างน้อยหนึ่งตัว tf.Tensor คืออ็อบเจ็กต์ที่มีคุณสมบัติสามประการ:

  • ป้ายกำกับที่ไม่ซ้ำ (ชื่อ)
  • มิติ (รูปร่าง)
  • ชนิดข้อมูล (dtype)

ทุกการดำเนินการที่คุณทำด้วย TensorFlow เกี่ยวข้องกับการจัดการกับเทนเซอร์ โดยมีเทนเซอร์หลักสี่ประเภทที่คุณสามารถสร้างได้:

  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีการสร้าง tf.constant และ tf.Variable.

สิ่งหนึ่งที่ควรทราบก่อนรันโค้ดคือ บทช่วยสอนนี้ใช้ API ของ TensorFlow 1.x ดั้งเดิม ซึ่งจะสร้างกราฟก่อนแล้วจึงรันในภายหลังภายในเซสชัน TensorFlow 2 ทำงานแบบ eagerly (รันทันที) โดยค่าเริ่มต้น ดังนั้นสัญลักษณ์บางส่วนด้านล่างจึงถูกย้ายหรือลบออกไป แต่ทุกสัญลักษณ์ยังคงสามารถเข้าถึงได้ผ่านทางโค้ด tf.compat.v1 เนมสเปซ และตารางจะแมปแต่ละรายการไปยังคู่ที่เทียบเท่าในยุคปัจจุบัน

สัญลักษณ์ TensorFlow 1.x เทียบเท่า TensorFlow 2
tf.placeholder() ไม่จำเป็น การดำเนินการอย่างรวดเร็วจะยอมรับ Python หรือค่า NumPy โดยตรง และ tf.function พารามิเตอร์มีบทบาทเดียวกันในโหมดกราฟ
tf.Session() และ sess.run() เรียกใช้งานโดยตรงและอ่านผลลัพธ์ หรือห่อหุ้มการคำนวณไว้ใน tf.function.
tf.get_variable() tf.Variable()ด้วยความเรียบง่าย Python วัตถุ tracกำหนดตัวแปรแทนที่จะกำหนดกลุ่มข้อมูล
tf.global_variables_initializer() ไม่จำเป็น tf.Variable จะถูกกำหนดค่าเริ่มต้นในขณะที่ถูกสร้างขึ้น
tf.div() tf.divide()โปรดทราบด้วยว่าเรือดำน้ำtraction op สะกดว่า tf.subtract()ไม่ tf.substract().

ก่อนเริ่มทำตามบทช่วยสอน โปรดตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้งานสภาพแวดล้อม conda ที่ติดตั้ง TensorFlow ไว้แล้ว สภาพแวดล้อมนี้มีชื่อว่า hello-tf

ใช้เพื่อการ macOS ผู้ใช้:

source activate hello-tf

ใช้เพื่อการ Windows ผู้ใช้:

activate hello-tf

หลังจากทำตามขั้นตอนเหล่านั้นเสร็จแล้ว คุณก็พร้อมที่จะนำเข้า TensorFlow ได้แล้ว

# Import tf
import tensorflow as tf

สร้างเทนเซอร์ของ n-มิติ

คุณเริ่มต้นด้วยการสร้างเมตริกซ์ที่มีมิติเดียว ซึ่งก็คือสเกลาร์

ในการสร้างเทนเซอร์ คุณสามารถใช้ tf.constant() ดังแสดงในตัวอย่างรูปทรงเทนเซอร์ของ TensorFlow ด้านล่าง:

tf.constant(value, dtype, name = "")
arguments

- `value`: Value of n dimension to define the tensor. Optional
- `dtype`: Define the type of data:    
    - `tf.string`: String variable    
    - `tf.float32`: Float variable    
    - `tf.int16`: Integer variable
- "name": Name of the tensor. Optional. By default, `Const_1:0`

ในการสร้างเทนเซอร์ที่มีมิติเป็น 0 ให้รันโค้ดต่อไปนี้

## rank 0
# Default name
r1 = tf.constant(1, tf.int16) 
print(r1)			

เอาท์พุต

Tensor("Const:0", shape=(), dtype=int16)

ทั้งสามส่วนของผลลัพธ์นั้นจะสอดคล้องกับคุณสมบัติเทนเซอร์ทั้งสามประการ ดังที่คำอธิบายประกอบด้านล่างได้แสดงให้เห็นอย่างชัดเจน

เอาต์พุตเทนเซอร์ที่มีคำอธิบายประกอบระบุชื่อ รูปร่าง และประเภทข้อมูล

คุณยังสามารถตั้งชื่อเทนเซอร์เองได้ด้วย name ข้อโต้แย้ง.

# Named my_scalar
r2 = tf.constant(1, tf.int16, name = "my_scalar") 
print(r2)

เอาท์พุต

Tensor("my_scalar:0", shape=(), dtype=int16)

แต่ละเทนเซอร์จะแสดงผลโดยใช้ชื่อของเทนเซอร์นั้นๆ แต่ละออบเจ็กต์เทนเซอร์จะถูกกำหนดด้วยคุณลักษณะต่างๆ เช่น ป้ายกำกับที่ไม่ซ้ำกัน (ชื่อ) มิติ (รูปร่าง) และชนิดข้อมูล TensorFlow (dtype)

คุณสามารถกำหนดเมตริกซ์ด้วยค่าทศนิยมหรือสตริงได้โดยการเปลี่ยนประเภทของข้อมูล

# Decimal
r1_decimal = tf.constant(1.12345, tf.float32)
print(r1_decimal)
# String
r1_string = tf.constant("Guru99", tf.string)
print(r1_string)

เอาท์พุต

Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)

สามารถสร้างเทนเซอร์ที่มีมิติ 1 ได้ดังนี้:

## Rank 1
r1_vector = tf.constant([1,3,5], tf.int16)
print(r1_vector)
r2_boolean = tf.constant([True, True, False], tf.bool)
print(r2_boolean)

เอาท์พุต

Tensor("Const_3:0", shape=(3,), dtype=int16)
Tensor("Const_4:0", shape=(3,), dtype=bool)

คุณจะสังเกตได้ว่ารูปทรงของ TensorFlow ประกอบด้วยคอลัมน์เพียง 1 คอลัมน์เท่านั้น

ในการสร้างอาร์เรย์เทนเซอร์ 2 มิติ คุณต้องปิดวงเล็บหลังแต่ละแถว ดูตัวอย่างรูปร่างเทนเซอร์ด้านล่าง

## Rank 2
r2_matrix = tf.constant([ [1, 2],
                          [3, 4] ],tf.int16)
print(r2_matrix)

เอาท์พุต

Tensor("Const_5:0", shape=(2, 2), dtype=int16)

เมทริกซ์นี้มี 2 แถวและ 2 คอลัมน์ ซึ่งบรรจุค่า 1, 2, 3 และ 4

เมทริกซ์ 3 มิติถูกสร้างขึ้นโดยการเพิ่มวงเล็บอีกระดับหนึ่ง

## Rank 3
r3_matrix = tf.constant([ [[1, 2],
                           [3, 4], 
                           [5, 6]] ], tf.int16)
print(r3_matrix)

เอาท์พุต

Tensor("Const_6:0", shape=(1, 3, 2), dtype=int16)

ผลลัพธ์ที่ได้ตรงกับแผนภาพกล่องสามมิติที่แสดงไว้ก่อนหน้านี้ในบทเรียนนี้

รูปร่างของเทนเซอร์

เมื่อคุณพิมพ์เทนเซอร์ TensorFlow จะอนุมานรูปร่างของเทนเซอร์นั้น อย่างไรก็ตาม คุณสามารถอ่านรูปร่างของเทนเซอร์ได้โดยตรงด้วย TensorFlow shape คุณสมบัติ

ด้านล่างนี้ คุณสร้างเมทริกซ์ที่บรรจุด้วยตัวเลขตั้งแต่ 10 ถึง 15 แล้วตรวจสอบรูปร่างของเมทริกซ์นั้น m_shape.

# Shape of tensor
m_shape = tf.constant([ [10, 11],
                        [12, 13],
                        [14, 15] ]                      
                     ) 
m_shape.shape

เอาท์พุต

TensorShape([Dimension(3), Dimension(2)])

เมทริกซ์มี 3 แถว 2 คอลัมน์

TensorFlow มีคำสั่งที่มีประโยชน์ในการสร้างเวกเตอร์หรือเมทริกซ์ที่เต็มไปด้วย 0 หรือ 1 ตัวอย่างเช่น หากคุณต้องการสร้างเทนเซอร์ 1 มิติที่มีรูปร่างเฉพาะเจาะจงเป็น 10 และเต็มไปด้วย 0 คุณสามารถเรียกใช้โค้ดด้านล่างได้:

# Create a vector of 0
print(tf.zeros(10))

เอาท์พุต

Tensor("zeros:0", shape=(10,), dtype=float32)

คุณสมบัตินี้ใช้ได้กับเมทริกซ์เช่นกัน ในที่นี้ คุณสร้างเมทริกซ์ขนาด 10×10 ที่เติมด้วยเลข 1

# Create a vector of 1
print(tf.ones([10, 10]))

เอาท์พุต

Tensor("ones:0", shape=(10, 10), dtype=float32)

คุณสามารถใช้รูปร่างของเมทริกซ์ที่กำหนดเพื่อสร้างเวกเตอร์ที่มีค่าเป็นหนึ่งทั้งหมดได้ เมทริกซ์นั้น m_shape มีมิติ 3×2 ดังนั้นโค้ดต่อไปนี้จะสร้างเทนเซอร์ที่มี 3 แถวซึ่งเต็มไปด้วยเลข 1:

# Create a vector of ones with the same number of rows as m_shape
print(tf.ones(m_shape.shape[0]))

เอาท์พุต

Tensor("ones_1:0", shape=(3,), dtype=float32)

ถ้าคุณใส่ค่า 1 เข้าไปในวงเล็บ คุณจะได้เวกเตอร์ที่มีค่าเป็น 1 ทั้งหมด ซึ่งเท่ากับจำนวนคอลัมน์ในเมทริกซ์ m_shape.

# Create a vector of ones with the same number of column as m_shape
print(tf.ones(m_shape.shape[1]))

เอาท์พุต

Tensor("ones_2:0", shape=(2,), dtype=float32)

สุดท้าย คุณสามารถสร้างเมทริกซ์ขนาด 3x2 ที่บรรจุด้วยเลข 1 ทั้งหมดได้

print(tf.ones(m_shape.shape))

เอาท์พุต

Tensor("ones_3:0", shape=(3, 2), dtype=float32)

ประเภทของข้อมูล

คุณสมบัติประการที่สองของเทนเซอร์คือประเภทของข้อมูล เทนเซอร์สามารถเก็บข้อมูลได้เพียงประเภทเดียวในแต่ละครั้ง และคุณสามารถอ่านข้อมูลประเภทนั้นได้ด้วย dtype คุณสมบัติ

print(m_shape.dtype)

เอาท์พุต

<dtype: &#x27;int32'>

ในบางโอกาส คุณอาจต้องการเปลี่ยนประเภทของข้อมูล ใน TensorFlow นั้นสามารถทำได้ด้วย tf.cast วิธี

ตัวอย่าง

ด้านล่างนี้คือการแปลงเทนเซอร์แบบ float ให้เป็นจำนวนเต็มโดยใช้ cast วิธี

# Change type of data
type_float = tf.constant(3.123456789, tf.float32)
type_int = tf.cast(type_float, dtype=tf.int32)
print(type_float.dtype)
print(type_int.dtype)

เอาท์พุต

<dtype: &#x27;float32'>
<dtype: &#x27;int32'>

TensorFlow จะเลือกประเภทข้อมูลโดยอัตโนมัติเมื่อไม่ได้ระบุอาร์กิวเมนต์ในระหว่างการสร้างเทนเซอร์ TensorFlow จะเดาประเภทข้อมูลที่น่าจะเป็นไปได้มากที่สุด เช่น หากคุณส่งข้อความเข้าไป มันจะเดาว่าเป็นสตริง

การสร้าง OperaTor

TensorFlow ที่มีประโยชน์บางอย่าง Operaโปร

คุณรู้วิธีสร้างเทนเซอร์ด้วย TensorFlow แล้ว ถึงเวลาเรียนรู้วิธีดำเนินการทางคณิตศาสตร์แล้ว

TensorFlow มีการดำเนินการพื้นฐานทั้งหมด คุณสามารถเริ่มต้นด้วยการดำเนินการง่ายๆ และใช้เมธอดของ TensorFlow เพื่อคำนวณรากที่สองของจำนวน การดำเนินการนี้ตรงไปตรงมาเพราะต้องการเพียงอาร์กิวเมนต์เดียวในการสร้างเทนเซอร์

รากที่สองของจำนวนใดๆ สร้างขึ้นโดยใช้สูตร tf.sqrt(x)โดยที่ x เป็นจำนวนทศนิยม

x = tf.constant([2.0], dtype = tf.float32)
print(tf.sqrt(x))

เอาท์พุต

Tensor("Sqrt:0", shape=(1,), dtype=float32)

หมายเหตุ: ผลลัพธ์ที่ได้คือออบเจ็กต์เทนเซอร์ ไม่ใช่รากที่สองของ 2 ในตัวอย่างนี้ คุณแสดงนิยามของเทนเซอร์ ไม่ใช่ผลการคำนวณจริง ในส่วน "เซสชัน" ด้านล่าง คุณจะได้เรียนรู้วิธีที่ TensorFlow ดำเนินการคำนวณต่างๆ

ต่อไปนี้คือรายการของการดำเนินการที่ใช้กันทั่วไป แนวคิดพื้นฐานเหมือนกันคือ การดำเนินการแต่ละอย่างต้องการอาร์กิวเมนต์อย่างน้อยหนึ่งตัว

  • tf.add(a, b)
  • tf.subtract(a, b)
  • tf.multiply(a, b)
  • tf.divide(a, b)
  • tf.pow(a, b)
  • tf.exp(a)
  • tf.sqrt(a)

ตัวอย่าง

# Add
tensor_a = tf.constant([[1,2]], dtype = tf.int32)
tensor_b = tf.constant([[3, 4]], dtype = tf.int32)

tensor_add = tf.add(tensor_a, tensor_b)
print(tensor_add)

เอาท์พุต

Tensor("Add:0", shape=(1, 2), dtype=int32)

Code คำอธิบาย

สร้างเทนเซอร์สองตัว:

  • หนึ่งเทนเซอร์ที่มี 1 และ 2
  • หนึ่งเทนเซอร์ที่มี 3 และ 4

คุณรวมเทนเซอร์ทั้งสองเข้าด้วยกัน

โปรดสังเกตว่าเทนเซอร์ทั้งสองต้องมีรูปร่างเหมือนกัน นอกจากนี้ คุณยังสามารถทำการคูณระหว่างเทนเซอร์ทั้งสองได้อีกด้วย

# Multiply
tensor_multiply = tf.multiply(tensor_a, tensor_b)
print(tensor_multiply)

เอาท์พุต

Tensor("Mul:0", shape=(1, 2), dtype=int32)

ตัวแปร

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

ในการสร้างตัวแปร คุณสามารถใช้ tf.get_variable() วิธี

tf.get_variable(name = "", values, dtype, initializer)
argument
- `name = ""`: Name of the variable
- `values`: Dimension of the tensor
- `dtype`: Type of data. Optional
- `initializer`: How to initialize the tensor. Optional
If initializer is specified, there is no need to include the `values` as the shape of `initializer` is used.

ตัวอย่างเช่น โค้ดด้านล่างนี้สร้างตัวแปรสองมิติที่มีค่าสุ่มสองค่า โดยค่าเริ่มต้น TensorFlow จะส่งคืนค่าสุ่ม คุณตั้งชื่อตัวแปรว่า var

# Create a Variable
## Create 2 Randomized values
var = tf.get_variable("var", [1, 2])
print(var.shape)

เอาท์พุต

(1, 2)

ในตัวอย่างนี้ คุณสร้างตัวแปรที่มีหนึ่งแถวและสองคอลัมน์ ดังนั้นคุณจึงส่งค่า [1, 2] เป็นมิติของตัวแปร

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

var_init_1 = tf.get_variable("var_init_1", [1, 2], dtype=tf.int32,  initializer=tf.zeros_initializer)
print(var_init_1.shape)

เอาท์พุต

(1, 2)

นอกจากนี้ คุณยังสามารถส่งค่าของเทนเซอร์คงที่ไปยังตัวแปรได้ โดยสร้างเทนเซอร์คงที่ด้วยวิธีการดังกล่าว tf.constant() และใช้เทนเซอร์นั้นในการกำหนดค่าเริ่มต้นให้กับตัวแปร

ค่าเริ่มต้นของตัวแปรคือ 10, 20, 30 และ 40 เทนเซอร์ใหม่มีรูปร่างขนาด 2×2

# Create a 2x2 matrix
tensor_const = tf.constant([[10, 20],
[30, 40]])
# Initialize the first value of the tensor equals to tensor_const
var_init_2 = tf.get_variable("var_init_2", dtype=tf.int32,  initializer=tensor_const)
print(var_init_2.shape)

เอาท์พุต

(2, 2)

ตัวยึด

ตัวแปรแทนที่ (placeholder) มีจุดประสงค์เพื่อป้อนข้อมูลให้กับเทนเซอร์ ตัวแปรแทนที่ทำหน้าที่เริ่มต้นข้อมูลที่จะไหลเข้าไปในเทนเซอร์ ในการใส่ตัวแปรแทนที่ คุณจะใช้... feed_dict การโต้แย้ง และตัวแปรแทนที่จะถูกส่งเข้าไปเฉพาะภายในเซสชันเท่านั้น

ในตัวอย่างถัดไป คุณจะได้เห็นวิธีการสร้างตัวยึดตำแหน่งด้วยวิธีการดังกล่าว tf.placeholderในส่วน Session คุณจะได้เรียนรู้วิธีป้อนค่าเทนเซอร์จริงลงในตัวแปร Placeholder

ไวยากรณ์คือ:

tf.placeholder(dtype,shape=None,name=None )
arguments:
- `dtype`: Type of data
- `shape`: dimension of the placeholder. Optional. By default, shape of the data
- `name`: Name of the placeholder. Optional			
data_placeholder_a = tf.placeholder(tf.float32, name = "data_placeholder_a")
print(data_placeholder_a)

เอาท์พุต

Tensor("data_placeholder_a:0", dtype=float32)

เซสชั่น

TensorFlow ทำงานโดยใช้องค์ประกอบหลัก 3 ส่วน:

  • กราฟ
  • เมตริกซ์
  • เซสชั่น
ชิ้นส่วน Descriptไอออน
กราฟ กราฟเป็นพื้นฐานสำคัญใน TensorFlow การดำเนินการทางคณิตศาสตร์ทั้งหมด (ops) จะดำเนินการภายในกราฟ คุณสามารถจินตนาการถึงกราฟว่าเป็นโปรเจกต์ที่ทุกการดำเนินการถูกดำเนินการอยู่ภายใน โหนดต่างๆ แทนการดำเนินการเหล่านี้ และสามารถรับหรือสร้างเทนเซอร์ใหม่ได้
เมตริกซ์ เทนเซอร์แสดงถึงข้อมูลที่เปลี่ยนแปลงไประหว่างการดำเนินการต่างๆ คุณได้เห็นวิธีการกำหนดค่าเริ่มต้นให้กับเทนเซอร์ไปแล้วก่อนหน้านี้ ความแตกต่างระหว่างค่าคงที่และตัวแปรคือ ค่าเริ่มต้นของตัวแปรจะเปลี่ยนแปลงไปตามเวลา
เซสชั่น เซสชันจะดำเนินการตามคำสั่งต่างๆ จากกราฟ ในการป้อนค่าของเทนเซอร์ลงในกราฟ คุณต้องเปิดเซสชันก่อน ภายในเซสชัน คุณต้องเรียกใช้ตัวดำเนินการเพื่อสร้างเอาต์พุต

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

ในตัวอย่างด้านล่าง คุณจะ:

  • สร้างเทนเซอร์สองตัว
  • สร้างการดำเนินการ
  • เปิดเซสชัน
  • พิมพ์ผลลัพธ์

ขั้นตอนที่ 1) คุณสร้างเทนเซอร์สองตัวคือ x และ y

## Create, run  and evaluate a session
x = tf.constant([2])
y = tf.constant([4])

ขั้นตอนที่ 2) คุณสร้างตัวดำเนินการโดยการคูณ x และ y

## Create operator
multiply = tf.multiply(x, y)

ขั้นตอนที่ 3) คุณเปิดเซสชัน การคำนวณทั้งหมดจะเกิดขึ้นภายในเซสชัน และเมื่อคุณใช้งานเสร็จแล้ว คุณต้องปิดเซสชันนั้น

## Create a session to run the code
sess = tf.Session()
result_1 = sess.run(multiply)
print(result_1)
sess.close()

เอาท์พุต

[8]

Code คำอธิบาย

  • tf.Session(): เปิดเซสชัน การดำเนินการทั้งหมดจะเกิดขึ้นภายในเซสชันนั้น
  • run(multiply): ดำเนินการตามคำสั่งที่สร้างขึ้นในขั้นตอนที่ 2
  • print(result_1)สุดท้าย คุณสามารถพิมพ์ผลลัพธ์ได้
  • close(): ปิดเซสชัน

ผลลัพธ์แสดง 8 ซึ่งก็คือผลคูณของ x และ y

อีกวิธีหนึ่งในการสร้างเซสชันคือการสร้างภายในบล็อก ข้อดีคือเซสชันจะปิดโดยอัตโนมัติ

with tf.Session() as sess:
    result_2 = multiply.eval()
print(result_2)

เอาท์พุต

[8]

ในบริบทของการประชุม คุณสามารถใช้ eval() วิธีการดำเนินการ ซึ่งเทียบเท่ากับ run() และทำให้โค้ดอ่านง่ายขึ้น

คุณสามารถสร้างเซสชันและดูค่าภายในเทนเซอร์ที่คุณสร้างไว้ได้

## Check the tensors created before
sess = tf.Session()
print(sess.run(r1))
print(sess.run(r2_matrix))
print(sess.run(r3_matrix))

เอาท์พุต

1
[[1 2] 
 [3 4]]
[[[1 2]  
  [3 4]  
  [5 6]]]

โดยค่าเริ่มต้น ตัวแปรจะว่างเปล่า แม้หลังจากที่คุณสร้างเทนเซอร์แล้ว คุณต้องกำหนดค่าเริ่มต้นให้กับตัวแปรก่อนจึงจะสามารถใช้งานได้ อ็อบเจ็กต์ tf.global_variables_initializer() ฟังก์ชันนี้ใช้สำหรับกำหนดค่าเริ่มต้นให้กับตัวแปรทุกตัวพร้อมกัน ซึ่งเป็นประโยชน์ก่อนที่คุณจะทำการฝึกโมเดล

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

sess.run(tf.global_variables_initializer())
print(sess.run(var))
print(sess.run(var_init_1))
print(sess.run(var_init_2))

เอาท์พุต

[[-0.05356491  0.75867283]]
[[0 0]]
[[10 20] 
 [30 40]]

คุณสามารถใช้ตัวแปรแทนที่คุณสร้างไว้ก่อนหน้านี้และป้อนค่าจริงเข้าไปได้ คุณต้องส่งข้อมูลเข้าไปในตัวแปรนั้น feed_dict ข้อโต้แย้ง.

ตัวอย่างเช่น คุณจะยกกำลัง 2 ของ placeholder data_placeholder_a

import numpy as np
power_a = tf.pow(data_placeholder_a, 2)
with tf.Session() as sess:
    data = np.random.rand(1, 10)
    print(sess.run(power_a, feed_dict={data_placeholder_a: data}))  # Will succeed.

Code คำอธิบาย

  • import numpy as np: นำเข้า นำพาย ไลบรารีเพื่อสร้างข้อมูล
  • tf.pow(data_placeholder_a, 2): สร้างการดำเนินการ
  • np.random.rand(1, 10): สร้างอาร์เรย์ข้อมูลแบบสุ่ม
  • feed_dict={data_placeholder_a: data}ป้อนข้อมูลลงในตัวแปรตำแหน่ง

เอาท์พุต

[[0.05478134 0.27213147 0.8803037  0.0398424  0.21172127 0.01444725  0.02584014 0.3763949  0.66022706 0.7565559 ]]

กราฟ

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

กราฟแสดงโหนดและขอบ โหนดคือตัวแทนของการดำเนินการ กล่าวคือ หน่วยของการคำนวณ ขอบคือเทนเซอร์: มันสามารถสร้างเทนเซอร์ใหม่หรือใช้ข้อมูลอินพุต ขึ้นอยู่กับความสัมพันธ์ระหว่างการดำเนินการแต่ละรายการ

โครงสร้างของกราฟเชื่อมโยงการดำเนินการต่างๆ (เช่น โหนด) เข้าด้วยกัน และแสดงให้เห็นว่าแต่ละการดำเนินการได้รับข้อมูลอย่างไร โปรดทราบว่ากราฟไม่ได้แสดงผลลัพธ์ของการดำเนินการ แต่ช่วยให้เห็นภาพความเชื่อมโยงระหว่างการดำเนินการเหล่านั้นได้ชัดเจนยิ่งขึ้น

ลองมาดูตัวอย่างกัน สมมติว่าคุณต้องการประเมินค่าฟังก์ชันต่อไปนี้:

สูตร f ของ x และ z เท่ากับ x คูณ z บวก x กำลังสอง บวก z บวกห้า

TensorFlow สร้างกราฟเพื่อเรียกใช้ฟังก์ชัน โดยกราฟจะมีลักษณะดังนี้:

กราฟ TensorFlow ที่มีโหนดตัวแปร X และ Z เป็นตัวป้อนข้อมูลให้กับการดำเนินการ Mul, Pow และการบวกสามแบบ

คุณสามารถมองเห็นเส้นทางที่เทนเซอร์จะไปถึงจุดหมายปลายทางได้อย่างง่ายดาย

ยกตัวอย่างเช่น add โหนดไม่สามารถทำงานได้ก่อนทั้งสองอย่าง Mul และ Pow ได้สร้างผลลัพธ์ออกมาแล้ว กราฟแสดงให้เห็นว่า TensorFlow จะดำเนินการดังต่อไปนี้:

  1. คำนวณ x·z ใน Mul โหนดและ x² ใน Pow ปม
  2. นำผลลัพธ์ทั้งสองมารวมกันใน add ปม
  3. เพิ่ม z เข้าไปในผลรวมนั้นใน add_1 ปม
  4. เพิ่มค่าคงที่ 5 เข้าไป add_2 ปม
x = tf.get_variable("x", dtype=tf.int32,  initializer=tf.constant([5]))
z = tf.get_variable("z", dtype=tf.int32,  initializer=tf.constant([6]))
c = tf.constant([5], name =	"constant")
square = tf.constant([2], name =	"square")
f = tf.multiply(x, z) + tf.pow(x, square) + z + c

Code คำอธิบาย

  • x: เริ่มต้นตัวแปรที่เรียกว่า x ด้วยค่าคงที่ 5
  • z: เริ่มต้นตัวแปรชื่อ z ด้วยค่าคงที่ 6
  • c: เริ่มต้นเทนเซอร์คงที่ที่เรียกว่า c โดยมีค่าคงที่เท่ากับ 5
  • สี่เหลี่ยมจัตุรัส: เริ่มต้นเทนเซอร์คงที่ที่เรียกว่าสี่เหลี่ยมจัตุรัสโดยมีค่าคงที่เป็น 2
  • f: สร้างตัวดำเนินการ

ในตัวอย่างนี้ ค่าของตัวแปรต่างๆ ถูกกำหนดให้คงที่ เทนเซอร์คงที่ c คือพารามิเตอร์คงที่ในฟังก์ชัน f และมีค่าคงที่เท่ากับ 5 ในกราฟ คุณจะเห็นพารามิเตอร์นี้ในเทนเซอร์ที่เรียกว่าค่าคงที่

นอกจากนี้ยังมีการสร้างเทนเซอร์คงที่สำหรับกำลังในตัวดำเนินการด้วย tf.pow()ไม่จำเป็น แต่หมายความว่าเลขชี้กำลังจะปรากฏในกราฟเป็นวงกลมที่เรียกว่าสี่เหลี่ยม

จากกราฟ คุณจะเห็นได้ว่าเกิดอะไรขึ้นกับเทนเซอร์ และทำไมฟังก์ชันจึงคืนค่าเป็น 66: 5 × 6 บวก 5² บวก 6 บวก 5 เท่ากับ 66

โค้ดด้านล่างนี้จะประเมินฟังก์ชันภายในเซสชัน

init = tf.global_variables_initializer() # prepare to initialize all variables
with tf.Session() as sess:
    init.run() # Initialize x and y
    function_result = f.eval()
print(function_result)

เอาท์พุต

[66]

คู่มืออ้างอิงฉบับย่อเกี่ยวกับพื้นฐานของ TensorFlow

ตารางทั้งสี่ด้านล่างนี้รวบรวมคำสั่งทั้งหมดที่ใช้ในบทช่วยสอนนี้ เพื่อให้คุณสามารถค้นหาคำสั่งที่ต้องการได้โดยไม่ต้องเลื่อนกลับไปดูตัวอย่างทั้งหมด

สร้างเทนเซอร์คงที่

คงที่ วัตถุ
D0 tf.constant(1, tf.int16)
D1 tf.constant([1,3,5], tf.int16)
D2 tf.constant([ [1, 2], [3, 4] ],tf.int16)
D3 tf.constant([ [[1, 2],[3, 4], [5, 6]] ], tf.int16)

สร้างตัวดำเนินการ

สร้างตัวดำเนินการ วัตถุ
a + b tf.add(a, b)
ก * ข tf.multiply(a, b)

สร้างเทนเซอร์แปรผัน

สร้างตัวแปร วัตถุ
ค่าสุ่ม tf.get_variable("var", [1, 2])
เริ่มต้นค่าแรก tf.get_variable("var_init_2", dtype=tf.int32, initializer=[ [1, 2], [3, 4] ])

เปิดเซสชัน

เซสชั่น วัตถุ
สร้างเซสชัน tf.Session()
เรียกใช้เซสชั่น tf.Session.run()
ประเมินเทนเซอร์ variable_name.eval()
ปิดเซสชัน sess.close()
เซสชันต่อบล็อก with tf.Session() as sess:

คำถามที่พบบ่อย

ส่วนต่อท้ายคือดัชนีผลลัพธ์ของการดำเนินการที่สร้างเทนเซอร์ขึ้นมา Const:0 หมายถึงผลลัพธ์แรกของการดำเนินการชื่อ Const การดำเนินการที่มีผลลัพธ์หลายรายการจะใช้หมายเลข :0, :1 และอื่นๆ ต่อท้าย

ภายใต้การทำงานแบบ eager execution ให้เรียกเมธอด numpy() ของเทนเซอร์ หรือส่งผ่านไปยัง np.array() ในรูปแบบกราฟและเซสชันที่แสดงไว้ที่นี่ ค่าที่ส่งคืนโดย sess.run() นั้นเป็นค่าที่มีอยู่แล้ว นำพาย แถว

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

TensorFlow ใช้การกระจาย (broadcasting): มันเปรียบเทียบรูปร่างจากมิติที่ตามมาด้านหลัง และยืดแกนใดๆ ที่มีความยาวหนึ่งเพื่อให้ตรงกัน รูปร่างที่ไม่สามารถจัดเรียงด้วยวิธีนี้ได้ จะเกิดข้อผิดพลาด InvalidArgumentError แทนที่จะเดา

TensorFlow จะจัดสรรการดำเนินการไปยัง GPU ที่มองเห็นได้โดยอัตโนมัติ หากต้องการบังคับให้ใช้ GPU ให้ครอบโค้ดด้วยบล็อก `with tf.device('/GPU:0')` จากนั้นใช้ `tf.config.list_physical_devices('GPU')` เพื่อยืนยันว่าตรวจพบอุปกรณ์นั้นจริง

ทั้งสองอย่างเก็บข้อมูลแบบ n มิติที่มีชนิดข้อมูล แต่เทนเซอร์นั้นเปลี่ยนแปลงไม่ได้ สามารถจัดเก็บบน GPU หรือ TPU ได้ และบันทึกการดำเนินการที่ใช้กับมันเพื่อให้สามารถคำนวณเกรเดียนต์ได้ ในขณะที่อาร์เรย์ NumPy ทำไม่ได้ทั้งสามอย่างนั้น

ตัวตรวจสอบประเภทแบบคงที่และไลบรารีการระบุรูปร่างจะเปรียบเทียบรูปร่างที่ประกาศไว้กับตัวดำเนินการในโค้ดของคุณ และแจ้งเตือนความไม่ตรงกันก่อนเริ่มการทำงาน ตัวช่วยแก้ไขโค้ดจะแสดงคำเตือนเดียวกันนี้แบบอินไลน์ ซึ่งช่วยลดการลองผิดลองถูกในการแก้ไขรูปร่างส่วนใหญ่ping.

นักบิน GitHub แนะนำให้เขียนโค้ดเซสชันและโค้ดตัวยึดตำแหน่งใหม่โดยเรียกใช้งานแบบ eager-execution อย่างรวดเร็ว ตรวจสอบข้อเสนอแนะแต่ละข้อ เนื่องจากมักเสนอ shims ของ tf.compat.v1 ในขณะที่มี TensorFlow 2 ที่แท้จริงเป็นตัวเลือกทดแทนอยู่แล้ว

สรุปโพสต์นี้ด้วย: