Ngày Cộng đồng ML là ngày 9 tháng 11! Tham gia với chúng tôi để cập nhật từ TensorFlow, JAX, và nhiều hơn nữa Tìm hiểu thêm

Khái niệm cơ bản về tùy chỉnh: tensors và hoạt động

Xem trên TensorFlow.org Xem nguồn trên GitHub Tải xuống sổ ghi chép

Đây là hướng dẫn TensorFlow giới thiệu cho biết cách:

  • Nhập gói bắt buộc
  • Tạo và sử dụng bộ căng
  • Sử dụng tăng tốc GPU
  • Chứng minhtf.data.Dataset

Nhập TensorFlow

Để bắt đầu, hãy nhập mô-đun tensorflow . Kể từ TensorFlow 2, thực thi háo hức được bật theo mặc định. Điều này cho phép một giao diện người dùng tương tác hơn cho TensorFlow, chi tiết về nó chúng ta sẽ thảo luận ở phần sau.

import tensorflow as tf

Tensors

Tensor là một mảng đa chiều. Tương tự như đối tượng ndarray NumPy, đối tượng tf.Tensor có kiểu dữ liệu và hình dạng. Ngoài ra, tf.Tensor s có thể nằm trong bộ nhớ bộ tăng tốc (như GPU). TensorFlow cung cấp một thư viện hoạt động phong phú ( tf.add , tf.matmul , tf.linalg.inv , v.v.) sử dụng và sản xuất tf.Tensor s. Các hoạt động này tự động chuyển đổi các kiểu Python nguyên bản, ví dụ:

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)

Mỗi tf.Tensor có một hình dạng và một kiểu dữ liệu:

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'>

Sự khác biệt rõ ràng nhất giữa mảng NumPy và tf.Tensor s là:

  1. Hàng chục có thể được hỗ trợ bởi bộ nhớ tăng tốc (như GPU, TPU).
  2. Hàng chục là bất biến.

Tương thích NumPy

Chuyển đổi giữa TensorFlow tf.Tensor s và NumPy ndarray rất dễ dàng:

  • Các hoạt động TensorFlow tự động chuyển đổi NumPy ndarrays thành Tensors.
  • Hoạt động NumPy tự động chuyển đổi Tensors thành NumPy ndarrays.

Hàng chục được chuyển đổi rõ ràng thành các ndarrays NumPy bằng cách sử dụng phương thức .numpy() . Các chuyển đổi này thường rẻ vì mảng và tf.Tensor chia sẻ biểu diễn bộ nhớ cơ bản, nếu có thể. Tuy nhiên, không phải lúc nào cũng có thể chia sẻ biểu diễn cơ bản vì tf.Tensor có thể được lưu trữ trong bộ nhớ GPU trong khi mảng NumPy luôn được hỗ trợ bởi bộ nhớ máy chủ và quá trình chuyển đổi bao gồm một bản sao từ GPU sang bộ nhớ máy chủ.

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.]]

Tăng tốc GPU

Nhiều hoạt động TensorFlow được tăng tốc bằng cách sử dụng GPU để tính toán. Không có bất kỳ chú thích nào, TensorFlow tự động quyết định sử dụng GPU hay CPU cho một hoạt động — sao chép tensor giữa CPU và bộ nhớ GPU, nếu cần. Các độ căng được tạo ra bởi một thao tác thường được hỗ trợ bởi bộ nhớ của thiết bị mà thao tác đó được thực thi, ví dụ:

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

Tên thiết bị

Tensor.device tính Tensor.device cung cấp tên chuỗi đủ điều kiện của thiết bị lưu trữ nội dung của tensor. Tên này mã hóa nhiều chi tiết, chẳng hạn như số nhận dạng địa chỉ mạng của máy chủ lưu trữ mà chương trình này đang thực thi và thiết bị trong máy chủ đó. Điều này là bắt buộc để thực thi phân tán một chương trình TensorFlow. Chuỗi kết thúc bằng GPU:<N> nếu tensor được đặt trên GPU thứ N trên máy chủ.

Vị trí thiết bị rõ ràng

Trong TensorFlow, vị trí đề cập đến cách các hoạt động riêng lẻ được chỉ định (đặt trên) một thiết bị để thực thi. Như đã đề cập, khi không có hướng dẫn rõ ràng được cung cấp, TensorFlow sẽ tự động quyết định thiết bị nào sẽ thực hiện một hoạt động và sao chép tensors sang thiết bị đó, nếu cần. Tuy nhiên, các hoạt động TensorFlow có thể được đặt rõ ràng trên các thiết bị cụ thể bằng trình quản lý ngữ cảnh tf.device , ví dụ:

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

Bộ dữ liệu

Phần này sử dụng API tf.data.Dataset để xây dựng đường dẫn cung cấp dữ liệu cho mô hình của bạn. APItf.data.Dataset được sử dụng để xây dựng các đường ống đầu vào phức tạp, hiệu quả từ các phần đơn giản, có thể tái sử dụng sẽ cung cấp cho các vòng đào tạo hoặc đánh giá mô hình của bạn.

Tạo tập Dataset nguồn

Tạo tập dữ liệu nguồn bằng một trong các hàm gốc như Dataset.from_tensors , Dataset.from_tensor_slices hoặc sử dụng các đối tượng đọc từ các tệp như TextLineDataset hoặc TFRecordDataset . Xem hướng dẫn Tập dữ liệu TensorFlow để biết thêm thông tin.

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)

Áp dụng các phép biến đổi

Sử dụng các chức năng biến đổi như map , batchshuffle để áp dụng các phép biến đổi cho các bản ghi tập dữ liệu.

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

ds_file = ds_file.batch(2)

Lặp lại

tf.data.Dataset đối tượngtf.data.Dataset hỗ trợ lặp để lặp qua các bản ghi:

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)