Тензоры — это базовая структура данных библиотеки PyTorch.

Глубокое обучение является одним из основных направлений контролируемого машинного обучения, где, используя входные данные и помеченные выходные данные, мы стремимся разработать функцию для сопоставления входных данных с выходными. Глубокое обучение является глубоким именно в том смысле, что его модели изучают множество слоев преобразований, где каждый уровень предлагает представление на одном уровне [1] . Фреймворки глубокого обучения сыграли решающую роль в распространении идей. Первое поколение фреймворков, позволяющих легко моделировать, включало Caffe, Torch и Theano [1]. В этом уроке мы поговорим об основах тензора в PyTorch.

Установка ПиТорч

PyTorch – это библиотека машинного обучения с открытым исходным кодом, основанная на библиотеке Torch, которая используется для таких приложений, как компьютерная версия и обработка естественного языка. В первую очередь она разработана Исследовательской лабораторией искусственного интеллекта Facebook (FAIR).

PyTorch имеет две функции высокого уровня:

Инструкции по установке см. на веб-сайте PyTorch здесь. После выбора некоторых функций для версии, таких как ОС, пакет и язык, вы можете выполнить команду, которая появляется в Run this Command:, или перейти по указанному URL-адресу, чтобы загрузить и установить исходный код. Чтобы использовать возможности функции CUDA, ваша система должна быть оснащена графическим процессором NVIDIA. Чтобы проверить, поддерживает ли ваша система CUDA, зайдите здесь.

Тензор

PyTorch представляет фундаментальную структуру данных: тензор. Для тех, кто занимается математикой, физикой или инженерией, термин тензор связан с понятием пространств, систем отсчета и преобразований между ними [2]. С точки зрения глубокого обучения тензоры — это обобщение вектора и матрицы в произвольном количестве измерений. Другими словами, тензор — это многомерный массив.

Как видно из рисунка выше, тензор представляет собой (возможно, многомерный) массив числовых значений. С одной осью тензор соответствует (в математике) вектору. Тензор с двумя осями соответствует матрице. Тензоры с более чем двумя осями не имеют специальных математических названий.

PyTorch — не единственная библиотека, работающая с многомерными массивами. Между многомерными массивами в NumPy и тензором есть несколько общих черт. Однако, когда дело доходит до ускорителя, GPU хорошо поддерживается для ускорения вычислений, тогда как NumPy поддерживает только вычисления на ЦП. Во-вторых, тензорный класс поддерживает автоматическое дифференцирование. Эти свойства делают тензорный класс подходящим для глубокого обучения. Далее мы познакомим вас с некоторыми основными операциями с тензорами в PyTorch.

Импорт библиотеки PyTorch в скрипт Python

Ты можешь использовать

import torch

использовать Pytorch в реализации кода.

Проверьте, доступна ли CUDA в вашей системе

Используйте следующий код, чтобы проверить, поддерживает ли ваша система CUDA для ускорения GPU.

torch.cuda.is_available()

Выходные данные имеют логический тип, где True указывает на наличие CUDA, а False указывает на отсутствие CUDA.

Создание тензора

Вы можете вызвать тензорную переменную напрямую через

#an empty multi-dimensional (2 * 3 * 2) tensor
torch.empty(2, 3, 2)
# a 1*12 vector
torch.arange(12)
#a random 1*2 matrix 
torch.rand(1, 2)
#a random 1*2 matrix drawn from Gaussian distribution 
torch.randn(1, 2)
#a zero-filled 1*2 matrix 
torch.zeros(1, 2)
#a 1*2 matrix filled with only 1
torch.ones(1, 2)
#Specifying the type of the elements of the tensor
torch.ones(1, 2, dtype=torch.int)

или преобразование списка или массива NumPy в тензор через

#converting list into tensor
x = [1, 2, 3, 4, 5]
torch.tensor(x)
#converting NumPy into tensor
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = torch.from_numpy(x)
# Assign a copy of `x` to `y` by allocating new memory
y = x.clone()

Обратите внимание, что при преобразовании NumPy в тензор оба они указывают на одно и то же место в памяти. Другими словами, если вы измените переменную NumPy, x здесь, версия тензора, y, также изменится.

Тип и форма тензора

Используя приведенный ниже код, вы можете проверить типы тензора и его составляющих элементов.

x = torch.ones(1, 2, dtype=torch.int) 
#type of variable
type(x)
#type of the elements of tensor
x.dtype
#type of the elements of tensor
x.type()
#shape of tensor
x.shape
#total number of elements in a tensor
x.numel()

Нарезка

Доступ к данному элементу или подмножеству элементов в данном измерении возможен через

x = torch.rand(5, 3)
#tensor([[0.4788, 0.8171, 0.7119],
         [0.9143, 0.4804, 0.0356],
         [0.7858, 0.5312, 0.0178],
         [0.9417, 0.1743, 0.0691],
         [0.7302, 0.6352, 0.8515]]
#first column
x[:, 0]
# first row
x[0, :]
#row:1, column:3
x[1,3]

Для доступа к одному единственному элементу тензора в формате его нетензорного типа мы можем использовать метод item() как

#tensor format - tensor(0.4804)
x[1,3]
#scalar format
x[1, 3].item()
#scalar format with type
float(x[1, 3]) 
int(x[1, 3])

Нет, метод item доступен только для одного элемента тензора. Вы вызовете ошибку, если примените ее к тензору многомерного массива.

x[:,1].item()

Изменение размера/изменения формы

Мы можем изменить размер предопределенного тензора с помощью

# a 3*5 tensor
x = torch.rand(3, 5)
#resize x to 1*15
y = x.view(15)
#PyTorch can set the dimension automatically if -1 is given
y = x.view(-1, 3)
#another way to reshape the tensor
x.reshape(5, 3)

Обратите внимание, что произведение размерности тензора с измененным размером должно быть сохранено в выходных данных. Например, вы можете изменить размер 3 * 5 на 2 * 8, поскольку произведение первого размера равно 15, а второго - 16. Мы вызываем возможность автоматического обнаружения измерения, помещая -1 для измерения, которое мы хотели бы, чтобы тензоры автоматически выводили.

Конкатенация

Мы можем использовать операцию конкатенации, чтобы сложить матрицу по строкам (dim=0) или по столбцам (dim=1).

#concatenate along row
torch.cat((X, Y), dim=0)
#concatenate along column
torch.cat((X, Y), dim=1)

Арифметическая операция

Tensor — это основной блок PyTorch для обработки различных операций и хранения данных. Различные арифметические операции могут быть реализованы в разных форматах.

#defining two 2*2 tensor
x = torch.rand(2,2)
y = torch.rand(2,2)
#Addition
x+y
torch.add(x,y)
#Subtraction
x-y
torch.sub(x, y)
#Multiplication
x*y
torch.mul(x, y)
#division
x / y
torch.div(x, y)
#exponentiation, x to power y
x**y
#functional operation
torch.exp(x)

PyTorch также поддерживает работу на месте. Это позволяет вам назначать результат операции непосредственно данной переменной. Это может сэкономить вам много памяти, если модель машинного обучения обрабатывает тысячи параметров. Более того, мы можем указать на одни и те же параметры из нескольких переменных. Если мы не обновим на месте, другие ссылки по-прежнему будут указывать на старое место в памяти, что позволит частям нашего кода непреднамеренно ссылаться на устаревшие параметры. Вариант операции на месте выглядит следующим образом:

#add x to y and replace it into y
y.add_(x)
#also
y += x
#subtract
y.sub_(x)
#also
y -= x
#multiplication
y.mul_(x)
#also
y *=x
#division
y.div_(x)
#also
y /=x

Как правило, когда в любом методе PyTorch есть подчеркивание _, это указывает на то, что модификация происходит на месте.

Передача Tensor на CPU или GPU

Тензор может находиться в процессоре или графическом процессоре. Чтобы использовать возможности графического процессора, тензор должен быть передан в область действия графического процессора.

if torch.cuda.is_available():   # first check if CUDA is available
    device =torch.device("cuda") # set the device to CUDA
    x = torch.ones(5, device=device) #move the tensor to GPU
#another form of GPU transfer
y = torch.ones(5)
y = y.to(device)

Если мы хотим передать переменную обратно в ЦП, мы можем использовать метод to('cpu') как

#move back to the CPU
x = x.to("cpu")

Перемещение процессора назад необходимо для выполнения некоторых операций, особенно при преобразовании из тензора в NumPy, о чем будет рассказано далее.

Тензор в NumPy

Вы можете преобразовать тензор в формат NumPy, только если переменные находятся на ЦП. Если тензор находится в графическом процессоре, он выдаст ошибку. Чтобы добиться успеха, тензор должен быть сначала передан в ЦП.

#tesnor resides in CPU
x = torch.ones(1, 5)
#convert tensor to NumPy
z = x.numpy()

Если тензор находится в GPU, сначала его нужно переместить обратно в CPU, а затем преобразовать в NumPy:

if torch.cuda.is_available():   
    device =torch.device("cuda") 
    x = torch.ones(5, device=device) #move the tensor to GPU
#Since x is located in GPU, it should move back to CPU
x = x.to("cpu")
z = x.numpy()

Вот и все!

Ссылка

[1] https://d2l.ai/chapter_introduction/index.html

[2] Стивенс, Эли, Лука Антига и Томас Виманн. Глубокое обучение с PyTorch. Компания Manning Publications, 2020.