Xem trên TensorFlow.org | Chạy trong Google Colab | 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 minh
tf.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ề chúng ta sẽ thảo luận ở phần sau.
import tensorflow as tf
Căng thẳng
Tensor là một mảng đa chiều. Tương tự như các đối tượng ndarray
NumPy, các đố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à:
- Hàng chục có thể được hỗ trợ bởi bộ nhớ tăng tốc (như GPU, TPU).
- 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ủa chúng. 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ă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ị
Thuộc 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ữ chương trình này đang thực thi và thiết bị trong máy chủ lưu trữ đó. Điều này là bắt buộc để thực thi phân tán 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: 91.47ms On GPU: 10 loops: 388.16ms
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. API tf.data.Dataset
được sử dụng để xây dựng các đường ống dẫn đầ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 chuyển đổi như map
, batch
và shuffle
để á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
Các đối tượng tf.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([1 9], shape=(2,), dtype=int32) tf.Tensor([16 4], 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)