Посмотреть на TensorFlow.org | Запустить в Google Colab | Посмотреть исходный код на GitHub | Скачать блокнот |
Это вводное руководство по TensorFlow, в котором показано, как:
- Импортировать необходимый пакет
- Создание и использование тензоров
- Используйте ускорение графического процессора
- Демонстрация
tf.data.Dataset
Импорт TensorFlow
Для начала импортируйте модуль tensorflow
. Начиная с TensorFlow 2, нетерпеливое выполнение включено по умолчанию. Это делает интерфейс TensorFlow более интерактивным, подробности которого мы обсудим намного позже.
import tensorflow as tf
Тензоры
Тензор — это многомерный массив. Подобно объектам NumPy ndarray
, объекты tf.Tensor
имеют тип данных и форму. Кроме того, tf.Tensor
могут находиться в памяти ускорителя (например, 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:
- Тензоры могут поддерживаться памятью ускорителя (например, GPU, TPU).
- Тензоры неизменны.
NumPy-совместимость
Преобразование между tf.Tensor
s и NumPy ndarray
очень просто:
- Операции TensorFlow автоматически преобразуют NumPy ndarrays в тензоры.
- Операции NumPy автоматически преобразуют тензоры в ndarrays NumPy.
Тензоры явно преобразуются в ndarrays NumPy с помощью их .numpy()
. Эти преобразования обычно дешевы, поскольку массив и tf.Tensor
совместно используют базовое представление памяти, если это возможно. Однако совместное использование базового представления не всегда возможно, поскольку tf.Tensor
может размещаться в памяти графического процессора, в то время как массивы NumPy всегда поддерживаются памятью хоста, а преобразование включает копирование из графического процессора в память хоста.
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.]]
Ускорение графического процессора
Многие операции TensorFlow ускоряются с использованием графического процессора для вычислений. Без каких-либо аннотаций 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
-м 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: 91.47ms On GPU: 10 loops: 388.16ms
Наборы данных
В этом разделе используется API tf.data.Dataset
для создания конвейера для подачи данных в вашу модель. API tf.data.Dataset
используется для создания производительных сложных входных конвейеров из простых повторно используемых частей, которые будут использоваться в циклах обучения или оценки вашей модели.
Создайте исходный 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([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)