![]() | ![]() | ![]() | ![]() |
Это вводное руководство по TensorFlow, в котором показано, как:
- Импортируйте необходимый пакет
- Создавать и использовать тензоры
- Использовать ускорение графического процессора
- Продемонстрируйте
tf.data.Dataset
Импортировать TensorFlow
Для начала импортируйте модуль tensorflow
. Начиная с TensorFlow 2, активное выполнение включено по умолчанию. Это обеспечивает более интерактивный интерфейс для TensorFlow, детали которого мы обсудим гораздо позже.
import tensorflow as tf
Тензоры
Тензор - это многомерный массив. Подобно объектам NumPy ndarray
объекты tf.Tensor
имеют тип данных и форму. Кроме того, tf.Tensor
могут находиться в памяти ускорителя (например, в графическом процессоре). 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
:
- Тензоры могут поддерживаться памятью ускорителя (например, GPU, TPU).
- Тензоры неизменны.
Совместимость с NumPy
Преобразование между tf.Tensor
s и NumPy ndarray
очень просто:
- Операции TensorFlow автоматически преобразуют ndarrays NumPy в тензоры.
- Операции NumPy автоматически преобразуют тензоры в ndarrays NumPy.
Тензоры явно преобразуются в ndarrays NumPy с использованием их .numpy()
. Эти преобразования обычно дешевы, поскольку массив и tf.Tensor
используют 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.]]
GPU ускорение
Многие операции TensorFlow ускоряются с использованием графического процессора для вычислений. Без каких-либо аннотаций TensorFlow автоматически решает, использовать ли GPU или CPU для операции, копируя тензор между CPU и памятью GPU, если необходимо. Тензоры, создаваемые операцией, обычно поддерживаются памятью устройства, на котором выполнялась операция, например:
x = tf.random.uniform([3, 3])
print("Is there a GPU available: "),
print(tf.config.experimental.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
-м графическом процессоре хоста.
Явное размещение устройства
В TensorFlow под размещением понимается то, как отдельные операции назначаются (размещаются) устройству для выполнения. Как уже упоминалось, при отсутствии явных указаний TensorFlow автоматически решает, на каком устройстве выполнять операцию, и при необходимости копирует тензоры на это устройство. Однако операции TensorFlow можно явно разместить на определенных устройствах с помощью tf.device
контекста 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.experimental.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: 102.06ms On GPU: 10 loops: 231.87ms
Наборы данных
В этом разделе используется API tf.data.Dataset
для создания конвейера для подачи данных в вашу модель. APItf.data.Dataset
используется для создания эффективных, сложных конвейеров ввода из простых, повторно используемых частей, которые будут подпитывать циклы обучения или оценки вашей модели.
Создать исходный Dataset
Создайте исходный набор данных, используя одну из фабричных функций, например Dataset.from_tensors
, Dataset.from_tensor_slices
, или используя объекты, которые читаются из файлов, таких как TextLineDataset
или TFRecordDataset
. См. Руководство по TensorFlow Dataset для получения дополнительной информации.
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
поддерживают итерацию для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 4], shape=(2,), dtype=int32) tf.Tensor([16 9], 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)