Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Установка и настройка pytorch

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
21 апреля 2022 г.
3195
11 минут чтения
Средний рейтинг статьи: 5

New Documentation

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

PyTorch это еще и богатая экосистема инструментов для поддержки, ускорения разработки и исследования искусственного интеллекта. В этой статье мы изучим только основы. Научимся устанавливать библиотеку и проверим, что она действительно работает.

Установка И Настройка Pytorch (1)

Для работы вам понадобится:

  • Не менее 1 ГБ ОЗУ.
  • Установленный Python 3 и pip. Найти последнюю версию для Windows можно по запросу «https python org downloads windows».
  • Настроенная локальная среда для разработки.

Для прохождения этого туториала не требуются глубокие познания в машинном обучении. Предполагается, что вы знакомы с основными терминами и понятиями языка Python.

Установка PyTorch

Мы будем работать в среде 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. 

  • Пакет torchvision состоит из популярных наборов данных, архитектур моделей и общих преобразований изображений для компьютерного зрения.
  • Torchaudio — это библиотека для обработки звука и сигналов с помощью PyTorch. Он предоставляет функции ввода-вывода, обработки сигналов и данных, наборы данных, реализации моделей и компоненты приложений.

Это стандартный набор, который часто используют при первом знакомстве с библиотекой.

Рассмотренный выше способ — не единственный метод инсталляции. Если на 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 — простая нейронная сеть.

Для каждого слоя необходимо определить номер входа и выхода. Выходной номер слоя является входом следующего слоя.

  • Входной слой имеет 784 узла. 784 — результат умножения 28 на 28 (размер изображения в пикселях). 
  • Первый слой определяется выходным числом 86. Следовательно, первый скрытый слой должен иметь входное значение 86. Та же логика применяется дальше. 86 — произвольное число. Вы можете использовать другое значение.
  • Выходной слой содержит 10 узлов, потому что изображения представляют цифры от 0 до 9.

Каждый раз, когда данные проходят через слой, данные передаются в функцию активации.

Есть несколько функций активации. В этом примере используется 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]))

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

Выглядит это так:

Python

Заключение

PyTorch – это мощная платформа машинного обучения с открытым исходным кодом, которая ускоряет путь от исследовательского прототипа до производственного развертывания. С ней вы можете решать разные задачи из области искусственного интеллекта и нейронных сетей.

Установка библиотеки очень простая. Для начала работы не требуется глубоких познаний в машинном обучении. Достаточно знать базовые концепции, чтобы повторить и даже немного переделать под свои запросы популярные процедуры вроде распознавания изображений. Большой плюс PyTorch — развитое сообщество пользователей, которые пишут туториалы и делятся своими примерами применения библиотеки.

Распознавание объектов на изображениях — одна из самых простых и популярных задач на PyTorch для новичков. Но возможности библиотеки этим не ограничиваются. 

Для создания мощных нейронных сетей нужно очень много данных для обучения. Хранить их можно, например, на timeweb.cloud. Сервис предлагает объектное S3-хранилище с мгновенным доступом к данным через API или веб-интерфейс. Это отличное решение для хранения больших объёмов информации. 

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону