ช่วยปกป้อง Great Barrier Reef กับ TensorFlow บน Kaggle เข้าร่วมท้าทาย

พื้นฐานการปรับแต่ง: เทนเซอร์และการทำงาน

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

นี่คือบทแนะนำ TensorFlow เบื้องต้นที่แสดงวิธีการ:

  • นำเข้าแพ็คเกจที่จำเป็น
  • สร้างและใช้เทนเซอร์
  • ใช้การเร่งความเร็ว GPU
  • แสดงให้เห็นถึง tf.data.Dataset

นำเข้า TensorFlow

ในการเริ่มต้นนำเข้า tensorflow โมดูล สำหรับ TensorFlow 2 การดำเนินการอย่างกระตือรือร้นจะถูกเปิดใช้งานโดยค่าเริ่มต้น สิ่งนี้ทำให้ส่วนหน้าโต้ตอบกับ TensorFlow ได้มากขึ้น ซึ่งเราจะพูดถึงรายละเอียดในภายหลัง

import tensorflow as tf

เทนเซอร์

เทนเซอร์เป็นอาร์เรย์หลายมิติ คล้ายกับ NumPy ndarray วัตถุ tf.Tensor วัตถุมีประเภทข้อมูลและรูปร่าง นอกจากนี้ tf.Tensor s อาศัยอยู่ในหน่วยความจำที่สามารถเร่ง (เช่น GPU ก) TensorFlow มีห้องสมุดที่อุดมไปด้วยของการดำเนินงาน ( tf.add , tf.matmul , tf.linalg.inv ฯลฯ ) ที่การบริโภคและการผลิต tf.Tensor s การดำเนินการเหล่านี้จะแปลงประเภท Python ดั้งเดิมโดยอัตโนมัติ เช่น:

print(tf.add(1, 2))
print(tf.add([1, 2], [3, 4]))
print(tf.square(5))
print(tf.reduce_sum([1, 2, 3]))

# Operator overloading is also supported
print(tf.square(2) + tf.square(3))
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor([4 6], shape=(2,), dtype=int32)
tf.Tensor(25, shape=(), dtype=int32)
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor(13, shape=(), dtype=int32)

แต่ละ tf.Tensor มีรูปร่างและประเภทข้อมูล:

x = tf.matmul([[1]], [[2, 3]])
print(x)
print(x.shape)
print(x.dtype)
tf.Tensor([[2 3]], shape=(1, 2), dtype=int32)
(1, 2)
<dtype: 'int32'>

ความแตกต่างที่เห็นได้ชัดที่สุดระหว่างอาร์เรย์ NumPy และ tf.Tensor s คือ:

  1. รองรับเทนเซอร์ด้วยหน่วยความจำคันเร่ง (เช่น GPU, TPU)
  2. เทนเซอร์ไม่เปลี่ยนรูป

ความเข้ากันได้ของ NumPy

แปลงระหว่าง TensorFlow tf.Tensor s และ NumPy ndarray เป็นเรื่องง่าย:

  • การทำงานของ TensorFlow จะแปลง NumPy ndarrays เป็น Tensors โดยอัตโนมัติ
  • การดำเนินการ NumPy จะแปลง Tensors เป็น NumPy ndarrays โดยอัตโนมัติ

เทนเซอร์จะถูกแปลงอย่างชัดเจน ndarrays NumPy ใช้ของพวกเขา .numpy() วิธีการ การแปลงเหล่านี้มักจะมีราคาถูกตั้งแต่อาร์เรย์และ tf.Tensor หุ้นแทนหน่วยความจำพื้นฐานถ้าเป็นไปได้ อย่างไรก็ตามร่วมกันเป็นตัวแทนอ้างอิงคือไม่เสมอไปได้ตั้งแต่ tf.Tensor อาจจะเป็นเจ้าภาพในหน่วยความจำของ GPU ในขณะที่อาร์เรย์ NumPy ได้รับการสนับสนุนเสมอโดยหน่วยความจำโฮสต์และการแปลงเกี่ยวข้องกับสำเนาจาก GPU หน่วยความจำที่จะเป็นเจ้าภาพ

import numpy as np

ndarray = np.ones([3, 3])

print("TensorFlow operations convert numpy arrays to Tensors automatically")
tensor = tf.multiply(ndarray, 42)
print(tensor)


print("And NumPy operations convert Tensors to numpy arrays automatically")
print(np.add(tensor, 1))

print("The .numpy() method explicitly converts a Tensor to a numpy array")
print(tensor.numpy())
TensorFlow operations convert numpy arrays to Tensors automatically
tf.Tensor(
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]], shape=(3, 3), dtype=float64)
And NumPy operations convert Tensors to numpy arrays automatically
[[43. 43. 43.]
 [43. 43. 43.]
 [43. 43. 43.]]
The .numpy() method explicitly converts a Tensor to a numpy array
[[42. 42. 42.]
 [42. 42. 42.]
 [42. 42. 42.]]

การเร่งความเร็ว GPU

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

x = tf.random.uniform([3, 3])

print("Is there a GPU available: "),
print(tf.config.list_physical_devices("GPU"))

print("Is the Tensor on GPU #0:  "),
print(x.device.endswith('GPU:0'))
Is there a GPU available: 
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Is the Tensor on GPU #0:  
True

ชื่ออุปกรณ์

Tensor.device คุณสมบัติให้ชื่อสตริงที่มีคุณสมบัติครบถ้วนของอุปกรณ์โฮสติ้งเนื้อหาของเมตริกซ์ที่ ชื่อนี้เข้ารหัสรายละเอียดมากมาย เช่น ตัวระบุที่อยู่เครือข่ายของโฮสต์ที่โปรแกรมนี้กำลังทำงานและอุปกรณ์ภายในโฮสต์นั้น สิ่งนี้จำเป็นสำหรับการดำเนินการแบบกระจายของโปรแกรม TensorFlow สตริงปลายกับ GPU:<N> ถ้าเมตริกซ์วางอยู่บน N -th GPU บนโฮสต์

ตำแหน่งอุปกรณ์ที่ชัดเจน

ใน TensorFlow ตำแหน่งหมายถึงวิธีการดำเนินงานของแต่ละบุคคลที่ได้รับมอบหมาย (วางไว้บน) อุปกรณ์สำหรับการปฏิบัติ ดังที่กล่าวไว้ เมื่อไม่มีคำแนะนำที่ชัดเจน TensorFlow จะตัดสินใจโดยอัตโนมัติว่าอุปกรณ์ใดที่จะดำเนินการและคัดลอกเทนเซอร์ไปยังอุปกรณ์นั้น หากจำเป็น อย่างไรก็ตามการดำเนินงาน TensorFlow สามารถวางไว้อย่างชัดเจนบนอุปกรณ์ที่เฉพาะเจาะจงโดยใช้ tf.device ผู้จัดการบริบทตัวอย่างเช่น:

import time

def time_matmul(x):
  start = time.time()
  for loop in range(10):
    tf.matmul(x, x)

  result = time.time()-start

  print("10 loops: {:0.2f}ms".format(1000*result))

# Force execution on CPU
print("On CPU:")
with tf.device("CPU:0"):
  x = tf.random.uniform([1000, 1000])
  assert x.device.endswith("CPU:0")
  time_matmul(x)

# Force execution on GPU #0 if available
if tf.config.list_physical_devices("GPU"):
  print("On GPU:")
  with tf.device("GPU:0"): # Or GPU:1 for the 2nd GPU, GPU:2 for the 3rd etc.
    x = tf.random.uniform([1000, 1000])
    assert x.device.endswith("GPU:0")
    time_matmul(x)
On CPU:
10 loops: 93.77ms
On GPU:
10 loops: 397.49ms

ชุดข้อมูล

ในส่วนนี้จะใช้ tf.data.Dataset API เพื่อสร้างท่อส่งสำหรับการป้อนข้อมูลที่รูปแบบของคุณ tf.data.Dataset API จะใช้ในการสร้าง performant ท่อป้อนข้อมูลที่ซับซ้อนจากง่ายชิ้นใหม่ใช้งานที่จะเลี้ยงรุ่นของการฝึกอบรมหรือการประเมินผลลูป

สร้างแหล่ง Dataset

สร้างชุดข้อมูลแหล่งที่มาโดยใช้ฟังก์ชั่นหนึ่งในโรงงานเช่น Dataset.from_tensors , Dataset.from_tensor_slices หรือใช้วัตถุที่อ่านจากไฟล์เช่น TextLineDataset หรือ TFRecordDataset ดู คู่มือ TensorFlow ชุดข้อมูล สำหรับข้อมูลเพิ่มเติม

ds_tensors = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6])

# Create a CSV file
import tempfile
_, filename = tempfile.mkstemp()

with open(filename, 'w') as f:
  f.write("""Line 1
Line 2
Line 3
  """)

ds_file = tf.data.TextLineDataset(filename)

ใช้การแปลงร่าง

ใช้ฟังก์ชั่นการแปลงเช่น map , batch และ shuffle ไปใช้การแปลงชุดข้อมูลที่บันทึก

ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)

ds_file = ds_file.batch(2)

ย้ำ

tf.data.Dataset วัตถุสนับสนุนย้ำห่วงมากกว่าบันทึก:

print('Elements of ds_tensors:')
for x in ds_tensors:
  print(x)

print('\nElements in ds_file:')
for x in ds_file:
  print(x)
Elements of ds_tensors:
tf.Tensor([4 9], shape=(2,), dtype=int32)
tf.Tensor([ 1 16], shape=(2,), dtype=int32)
tf.Tensor([25 36], shape=(2,), dtype=int32)

Elements in ds_file:
tf.Tensor([b'Line 1' b'Line 2'], shape=(2,), dtype=string)
tf.Tensor([b'Line 3' b'  '], shape=(2,), dtype=string)