PyTorch — это бесплатная библиотека для глубокого обучения с открытым исходным кодом. С ее помощью компьютер может обнаруживать объекты, классифицировать изображения, генерировать тексты и выполнять другие сложные задачи.
PyTorch это еще и богатая экосистема инструментов для поддержки, ускорения разработки и исследования искусственного интеллекта. В этой статье мы изучим только основы. Научимся устанавливать библиотеку и проверим, что она действительно работает.
Для работы вам понадобится:
Для прохождения этого туториала не требуются глубокие познания в машинном обучении. Предполагается, что вы знакомы с основными терминами и понятиями языка Python.
cloud
Мы будем работать в среде Windows, но использовать командную строку. Это делает туториал практически универсальным — те же команды можно использовать на Linux и macOS.
Сначала создайте рабочее пространство, внутри которого вы будете работать с Torch Python.
Перейдите в каталог, где хотите разместить новую директорию. И создайте папку:
mkdir pytorch
Внутри каталога pytorch создайте новую виртуальную среду. Это нужно для того, чтобы в дальнейшем изолировать проекты и при необходимости использовать разные версии библиотек.
python3 -m venv virtualpytorch
Чтобы виртуальная среда заработала, нужно её активировать. Сначала перейдите в созданный на предыдущем шаге каталог:
cd virtualpytorch
Внутри него размещена папка Scripts (в Windows) или bin (в других ОС). Перейдите в нее, указав имя директории:
сd scripts
Активируйте виртуальную среду с помощью bat-файла. Выполните в командной строке:
асtivate.bat
Рабочее пространство готово. Следующий шаг — установка самой библиотеки.
Самый простой способ узнать команду инсталляции — посмотреть её на официальном сайте библиотеки. На странице с описанием локального запуска есть удобная форма, в которой вам нужно выбрать необходимые параметры.
В качестве примера установите через pip стабильную версию для Windows, которая использует CPU. Выберите эти параметры в форме и получите в ответ нужную команду:
pip3 install torch torchvision torchaudio
Скопируйте команду pip install torch и выполните её в командной строке Windows. Обратите внимание, что вы устанавливаете сразу две подбиблиотеки — torchvision и torchaudio.
Это стандартный набор, который часто используют при первом знакомстве с библиотекой.
Рассмотренный выше способ — не единственный метод инсталляции. Если на Windows установлена Anaconda, то вы можете использовать графический интерфейс. Если на компьютере используются видеокарты NVIDIA, то вы можете выбрать версию CUDA, а не CPU. Тогда и команда для инсталляции будет другой.
Все возможные способы локального запуска библиотеки указаны в официальной документации. Там же можно найти команды для установки старых версий библиотеки. Для их применения не нужно даже знать, как установить whl python. Вы просто выбираете нужную версию и ставите её так же, как актуальные сборки пакета.
Чтобы проверить работоспособность библиотеки, необязательно писать скрипт. Для выполнения базовых операций достаточно возможностей интерпретатора Python.
Если вы успешно инсталлировали библиотеку на предыдущих шагах, то задача установить интерпретатор Python перед вами уже не возникнет. Чтобы запустить его, выполните в командной строке команду:
python
import torch
x = torch.rand(5, 3)
print(x)
В ответ отобразится установленная версия, а также появится интерфейс интерпретатора. Введите следующий код:
import torch
x = torch.rand(5, 3)
print(x)
Ответ должен быть примерно таким:
tensor([[0.0925, 0.3696, 0.4949],
[0.0240, 0.2642, 0.1545],
[0.7274, 0.4975, 0.0753],
[0.4438, 0.9685, 0.5022],
[0.4757, 0.6715, 0.4298]])
Это значит, что команда pytorch install выполнена успешно. Теперь можно переходить к решению более сложных задач.
Чтобы изучать базовые концепции было интересно, будем делать это на практике. Например, давайте создадим с помощью PyTorch нейронную сеть, которая умеет определять, какая цифра изображена на картинке.
Для создания нейронной сети потребуется восемь импортов:
import torch
import torchvision
import torch.nn.functional as F
import matplotlib.pyplot as plt
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms, datasets
Всё это элементы стандартной библиотеки PyTorch плюс библиотека Matplotlib. Они отвечают за работу с изображениями, оптимизацию, помогают с построением нейронных сетей и отображение графиков.
Нейронная сеть будет обучаться на наборе данных MNIST, который содержит 70 000 изображений цифр, написанных от руки. 60 000 — для обучения, 10 000 — для тестирования. Размер изображений — 28 x 28 пикселей. У каждого из них есть метка, которая обозначает изображенную цифру — 1, 2, 5 и т.д.
train = datasets.MNIST("", train=True, download=True,
transform = transforms.Compose([transforms.ToTensor()]))
test = datasets.MNIST("", train=False, download=True,
transform = transforms.Compose([transforms.ToTensor()]))
trainset = torch.utils.data.DataLoader(train, batch_size=15, shuffle=True)
testset = torch.utils.data.DataLoader(test, batch_size=15, shuffle=True)
Сначала необходимо разделить данные на обучающие и тестовые наборы. Вы делаете это, устанавливая train=True/False. Тестовый набор должен содержать данные, с которыми машина раньше не сталкивалась. Иначе работа нейронной сети будет предвзятой.
Shuffle (shuffle=True) помогает уменьшить предвзятость и переоснащение. Представьте, что данные имеют много значений «1» по порядку. Допустим, машина станет слишком опытной в распознавании только единицы. Когда приходит другая цифра, машина слишком «осведомлена» (переоснащается) в идентификации определенного типа данных и поэтому застревает при распознавании других данных.
Следующий этап — определение нейронной сети.
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 86)
self.fc2 = nn.Linear(86, 86)
self.fc3 = nn.Linear(86, 86)
self.fc4 = nn.Linear(86, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = self.fc4(x)
return F.log_softmax(x, dim=1)
model = NeuralNetwork()
Нейронная сеть состоит из четырех слоев. Один входной, два скрытых и один выходной. Тип Linear — простая нейронная сеть.
Для каждого слоя необходимо определить номер входа и выхода. Выходной номер слоя является входом следующего слоя.
Каждый раз, когда данные проходят через слой, данные передаются в функцию активации.
Есть несколько функций активации. В этом примере используется ReLU — Rectified Activation Function. Функция возвращает 0, если значение отрицательное, и само значение, если оно положительное.
Функция softmax для вывода нормализует значение. Это дает вероятность, например, 80%, что на изображении цифра 1, 30%, что на изображении цифра 5 и т.д. Выбирается наибольшая вероятность.
Затем начинается этап обучения.
optimizer = optim.Adam(model.parameters(), lr=0.001)
EPOCHS = 3
for epoch in range(EPOCHS):
for data in trainset:
X, y = data
model.zero_grad()
output = model(X.view(-1, 28 * 28))
loss = F.nll_loss(output, y)
loss.backward()
optimizer.step()
print(loss)
Оптимизатор вычисляет разницу (потери) между фактическими данными и прогнозом, корректирует вес, снова вычисляет потери и продолжает цикл до тех пор, пока потери не станут минимальными.
Здесь сравнивается реальность с прогнозом, сделанным моделью. В случае с учебным пособием точность высокая, потому что нейронная сеть очень хорошо распознает каждую цифру.
correct = 0
total = 0
with torch.no_grad():
for data in testset:
data_input, target = data
output = model(data_input.view(-1, 784))
for idx, i in enumerate(output):
if torch.argmax(i) == target[idx]:
correct += 1
total += 1
print('Accuracy: %d %%' % (100 * correct / total))
Чтобы убедиться в том, что нейронная сеть работает, передайте ей изображение некоторой цифры из тестового набора:
plt.imshow(X[1].view(28,28))
plt.show()
print(torch.argmax(model(X[1].view(-1, 784))[0]))
В ответ должна отобразиться цифра, которая изображена на переданной картинке.
Наглядно увидеть работу нейронной сети можно, запустив наш полученный скрипт:
import torch
import torchvision
import torch.nn.functional as F
import matplotlib.pyplot as plt
import torch.nn as nn
import torch.optim as optim
from torchvision import transforms, datasets
train = datasets.MNIST("", train=True, download=True,
transform = transforms.Compose([transforms.ToTensor()]))
test = datasets.MNIST("", train=False, download=True,
transform = transforms.Compose([transforms.ToTensor()]))
trainset = torch.utils.data.DataLoader(train, batch_size=15, shuffle=True)
testset = torch.utils.data.DataLoader(test, batch_size=15, shuffle=True)
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 86)
self.fc2 = nn.Linear(86, 86)
self.fc3 = nn.Linear(86, 86)
self.fc4 = nn.Linear(86, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = self.fc4(x)
return F.log_softmax(x, dim=1)
model = NeuralNetwork()
optimizer = optim.Adam(model.parameters(), lr=0.001)
EPOCHS = 3
for epoch in range(EPOCHS):
for data in trainset:
X, y = data
model.zero_grad()
output = model(X.view(-1, 28 * 28))
loss = F.nll_loss(output, y)
loss.backward()
optimizer.step()
print(loss)
correct = 0
total = 0
with torch.no_grad():
for data in testset:
data_input, target = data
output = model(data_input.view(-1, 784))
for idx, i in enumerate(output):
if torch.argmax(i) == target[idx]:
correct += 1
total += 1
print('Accuracy: %d %%' % (100 * correct / total))
plt.imshow(X[1].view(28,28))
plt.show()
print(torch.argmax(model(X[1].view(-1, 784))[0]))
При каждом запуске сеть будет брать случайную картинку из тестового набора и исследовать изображенную на ней цифру. После завершения работы отображается точность распознавания в процентах, сама картинка и та цифра, которую распознала нейронная сеть.
Выглядит это так:
Подготовили для вас выгодные тарифы на облачные серверы
PyTorch – это мощная платформа машинного обучения с открытым исходным кодом, которая ускоряет путь от исследовательского прототипа до производственного развертывания. С ней вы можете решать разные задачи из области искусственного интеллекта и нейронных сетей.
Установка библиотеки очень простая. Для начала работы не требуется глубоких познаний в машинном обучении. Достаточно знать базовые концепции, чтобы повторить и даже немного переделать под свои запросы популярные процедуры вроде распознавания изображений. Большой плюс PyTorch — развитое сообщество пользователей, которые пишут туториалы и делятся своими примерами применения библиотеки.
Распознавание объектов на изображениях — одна из самых простых и популярных задач на PyTorch для новичков. Но возможности библиотеки этим не ограничиваются.
Для создания мощных нейронных сетей нужно очень много данных для обучения. Хранить их можно, например, на timeweb.cloud. Сервис предлагает объектное S3-хранилище с мгновенным доступом к данным через API или веб-интерфейс. Это отличное решение для хранения больших объёмов информации.