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

Этот учебник по PyTorch даст вам полное представление о PyTorch в следующей последовательности:

  • Что такое PyTorch?
  • Особенности PyTorch
  • Установка PyTorch
  • Мост NumPy
  • PyTorch: модуль AutoGrad
  • Пример использования: классификатор изображений

Фреймворки глубокого обучения в Python

Python предпочтителен для кодирования и работы с глубоким обучением и, следовательно, имеет широкий спектр фреймворков на выбор. Такие как:

  • TensorFlow
  • PyTorch
  • Керас
  • Theano
  • Лазанья

Что такое PyTorch?

Это пакет для научных вычислений на основе Python, ориентированный на две группы аудитории:

  • Замена для NumPy, позволяющая использовать возможности графических процессоров.
  • Исследовательская платформа для глубокого обучения, обеспечивающая максимальную гибкость и скорость.

Особенности PyTorch - Основные моменты

  1. Встроенная поддержка Python и использование его библиотек
  2. Активно используется в разработке Facebook для выполнения всех требований платформы по глубокому обучению.
  3. PyTorch обеспечивает простой в использовании API, который помогает упростить использование и лучшее понимание при использовании API.
  4. Графики динамических вычислений являются здесь основным преимуществом, поскольку они обеспечивают динамическое построение графа - в каждой точке выполнения кода граф строится вместе, и им можно манипулировать во время выполнения.
  5. PyTorch работает быстро и кажется родным, что обеспечивает простое кодирование и быструю обработку.
  6. Поддержка CUDA гарантирует, что код может работать на графическом процессоре, тем самым сокращая время, необходимое для запуска кода, и повышая общую производительность системы.

Установка PyTorch

В этой статье давайте посмотрим, насколько просто установить PyTorch на ваш компьютер.

Это довольно прямолинейно, учитывая системные свойства, такие как Операционная система или диспетчеры пакетов. Его можно установить из командной строки или в IDE, например PyCharm и т. Д.

Далее в этой статье давайте посмотрим, как NumPy интегрирован в PyTorch.

Тензоры

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

Давайте построим простой тензор и проверим результат. Сначала давайте посмотрим, как мы можем построить матрицу 5 × 3, не имеющую отношения к инициации:

x = torch.empty(5, 3)
print(x)

Вывод:

tensor([[8.3665e+22, 4.5580e-41, 1.6025e-03],
        [3.0763e-41, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00, 3.4438e-41],
        [0.0000e+00, 4.8901e-36, 2.8026e-45],
        [6.6121e+31, 0.0000e+00, 9.1084e-44]])

Теперь давайте построим случайно инициализированную матрицу:

x = torch.rand(5, 3)
print(x)

Вывод:

tensor([[0.1607, 0.0298, 0.7555],
        [0.8887, 0.1625, 0.6643],
        [0.7328, 0.5419, 0.6686],
        [0.0793, 0.1133, 0.5956],
        [0.3149, 0.9995, 0.6372]])

Построить тензор прямо из данных:

x = torch.tensor([5.5, 3]) 
print(x)

Вывод:

tensor([5.5000, 3.0000])

Тензорные операции

Есть несколько синтаксисов для операций. В следующем примере мы рассмотрим операцию сложения:

y = torch.rand(5, 3) 
print(x + y)

Вывод:

tensor([[ 0.2349, -0.0427, -0.5053],
            [ 0.6455,  0.1199,  0.4239],
            [ 0.1279,  0.1105,  1.4637],
            [ 0.4259, -0.0763, -0.9671],
            [ 0.6856,  0.5047,  0.4250]])

Изменение размера: если вы хотите изменить форму / размер тензора, вы можете использовать torch.view:

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())

Вывод:

torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

NumPy для PyTorch

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

Он также используется как:

  • Библиотека, содержащая инструменты для интеграции кода C / C ++ и FORTRAN.
  • Возможности линейной алгебры, преобразования Фурье и случайных чисел.

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

Это позволяет NumPy легко и быстро интегрироваться с широким спектром баз данных!

Мост NumPy - массивы и тензоры

Преобразование тензора Torch в массив NumPy и наоборот очень просто!

Массив Torch Tensor и NumPy совместно используют свои базовые ячейки памяти, и изменение одного из них изменит другое.

Преобразование тензора Torch в массив NumPy:

Создайте тензор факела:

a = torch.ones(5) 
print(a)

Вывод:

tensor([1., 1., 1., 1., 1.])

Создайте массив NumPy:

b = a.numpy() 
print(b)

Вывод:

[1. 1. 1. 1. 1.]

Давайте выполним операцию суммирования и проверим изменения значений:

a.add_(1)
print(a)
print(b)

Вывод:

tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]

Преобразование массива NumPy в тензор Torch:

import numpy as no
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

Вывод:

[2. 2. 2. 2. 2.] 
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

Итак, как видите, это так просто!

Далее в этой статье давайте рассмотрим модуль AutoGrad в PyTorch.

PyTorch: модуль AutoGrad

Пакет autograd обеспечивает автоматическое различие для всех операций с тензорами.

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

Далее в этой статье рассмотрим интересный и простой пример использования.

Пример использования PyTorch: обучение классификатора изображений

Обычно, когда вам нужно иметь дело с изображениями, текстом, аудио или видео, вы можете использовать стандартные пакеты Python, которые загружают данные в массив Numpy. Затем вы можете преобразовать этот массив в torch. * Tensor.

  • Для изображений полезны такие пакеты, как Pillow и OpenCV.
  • Для аудио такие пакеты, как Scipy и Librosa.
  • Для текста полезны либо исходный Python, загрузка на основе Cython, либо NLTK и SpaCy.

Специально для зрения существует пакет под названием torchvision, в котором есть загрузчики данных для общих наборов данных, таких как Imagenet, CIFAR10, MNIST и т. Д.. и преобразователи данных для изображений.

Это обеспечивает огромное удобство и позволяет избежать написания шаблонного кода.

В этом руководстве мы будем использовать набор данных CIFAR10.

У него есть классы: «самолет», «автомобиль», «птица», «кошка», «олень», «собака», «лягушка», «лошадь», «корабль», «грузовик». '. Изображения в CIFAR-10 имеют размер 3x32x32, т. Е. Трехканальные цветные изображения размером 32x32 пикселя, как показано ниже:

PyTorch: обучение классификатора CIFAR10

Мы сделаем следующие шаги по порядку:

  1. Загрузка и нормализация CIFAR10
  2. Определите сверточную нейронную сеть
  3. Определите функцию потерь
  4. Обучите сеть на обучающих данных
  5. Протестируйте сеть на тестовых данных

Загрузка и нормализация CIFAR10

Используя torchvision, очень просто загрузить CIFAR10!

Это очень просто:

import torch
import torchvision
import torchvision.transforms as transforms

Выходными данными наборов данных torchvision являются изображения PILImage диапазона [0, 1]. Преобразуем их в Тензоры нормализованного диапазона [-1, 1].

transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

Вывод:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz Files already downloaded and verified

Затем давайте распечатаем несколько обучающих изображений из набора данных!

import matplotlib.pyplot as plt
import numpy as np
 
# functions to show an image
 
 
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
 
 
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
 
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

Вывод:

dog  bird horse horse

Определите сверточную нейронную сеть

Рассмотрим случай использования трехканальных изображений (красного, зеленого и синего). Вот код для определения архитектуры CNN:

import torch.nn as nn
import torch.nn.functional as F
 
 
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
 
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
 
 
net = Net()

Определить функцию потерь и оптимизатор

Нам нужно будет определить функцию потерь. В этом случае мы можем использовать потерю классификационной кросс-энтропии. Мы также будем использовать SGD с импульсом.

По сути, потеря кросс-энтропии - это значение вероятности в диапазоне от 0 до 1. Идеальная модель будет иметь потерю перекрестной энтропии, равную 0, но может случиться так, что ожидаемое значение может быть 0,2, а вы получите 2. Это приведет к очень большим убыткам и будет совершенно неэффективным!

import torch.optim as optim
 
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

Обучите сеть

Вот тогда начинается самое интересное! Нам просто нужно перебрать наш итератор данных, передать входные данные в сеть и оптимизировать .

for epoch in range(2): # loop over the dataset multiple times
 
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs
inputs, labels = data
 
# zero the parameter gradients
optimizer.zero_grad()
 
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
 
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
 
print('Finished Training')

Вывод:

[1,  2000] loss: 2.236
[1,  4000] loss: 1.880
[1,  6000] loss: 1.676
[1,  8000] loss: 1.586
[1, 10000] loss: 1.515
[1, 12000] loss: 1.464
[2,  2000] loss: 1.410
[2,  4000] loss: 1.360
[2,  6000] loss: 1.360
[2,  8000] loss: 1.325
[2, 10000] loss: 1.312
[2, 12000] loss: 1.302
Finished Training

Протестируйте сеть на тестовых данных

Мы обучили сеть для двух проходов по набору обучающих данных. Но нам нужно проверить, узнала ли вообще что-нибудь сеть.

Мы проверим это, предсказав метку класса l, которую выводит нейронная сеть, и проверив ее на соответствие истине. Если предсказание верное , мы добавляем образец в список правильных прогнозов.

Хорошо, первый шаг! Для ознакомления выведем изображение из тестового набора.

dataiter = iter(testloader)
images, labels = dataiter.next()
 
# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))

Вывод:

GroundTruth: cat ship ship plane

Хорошо, теперь давайте посмотрим, что нейронная сеть думает о приведенных выше примерах:

outputs = net(images)

Выходы - это энергии для 10 классов. Чем выше энергия для класса, тем больше сеть думает, что изображение относится к определенному классу. Итак, давайте получим показатель самой высокой энергии:

predicted = torch.max(outputs, 1)
 
print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
for j in range(4)))

Вывод:

Predicted: cat car car plane

Результаты кажутся неплохими.

Далее в этой статье давайте посмотрим, как сеть работает со всем набором данных!

correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
 
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))

Вывод:

Accuracy of the network on the 10000 test images: 54 %

Это выглядит лучше, чем шанс, что соответствует точности 10% (случайный выбор класса из 10).

Похоже, сеть чему-то научилась!

Какие классы показали хорошие, а какие нет?

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
 
 
for i in range(10):
print('Accuracy of %5s : %2d %%' % (
classes[i], 100 * class_correct[i] / class_total[i]))

Вывод:

Accuracy of plane : 61 %
Accuracy of   car : 85 %
Accuracy of  bird : 46 %
Accuracy of   cat : 23 %
Accuracy of  deer : 40 %
Accuracy of   dog : 36 %
Accuracy of  frog : 80 %
Accuracy of horse : 59 %
Accuracy of  ship : 65 %
Accuracy of truck : 46 %

В этой статье PyTorch Tutorial мы позаботились о обучении небольшой нейронной сети, которая классифицирует изображения, и оказалось, что как и ожидалось!

На этом мы подошли к концу нашей статьи о «Руководстве по PyTorch». Надеюсь, вы нашли эту статью информативной и добавили ценности вашим знаниям.

Если вы хотите ознакомиться с другими статьями о самых популярных технологиях на рынке, таких как искусственный интеллект, DevOps, этический взлом, посетите официальный сайт Edureka.

Обязательно обратите внимание на другие статьи в этой серии, которые объяснят различные другие аспекты глубокого обучения.

1. Учебное пособие по TensorFlow

2. Обнаружение объектов в TensorFlow

3. Алгоритм обучения персептрона.

4. Учебник по нейронной сети

5. Что такое обратное распространение?

6. Сверточные нейронные сети

7. Капсульные нейронные сети

8. Рекуррентные нейронные сети

9. Учебник по автоэнкодерам

10. Ограниченное руководство по машине Больцмана

11. PyTorch против TensorFlow

12. Глубокое обучение с помощью Python

13. Учебник по искусственному интеллекту

14. Классификация изображений TensorFlow

15. Приложения искусственного интеллекта

16. Как стать инженером по искусственному интеллекту?

17. Q Learning

18. Априорный алгоритм.

19. Цепи Маркова с Python

20. Алгоритмы искусственного интеллекта

21. Лучшие ноутбуки для машинного обучения

22. 12 лучших инструментов искусственного интеллекта

23. Вопросы на собеседовании по искусственному интеллекту (ИИ)

24. Теано против TensorFlow

25. Что такое нейронная сеть?

26. Распознавание образов.

27. Альфа-бета-обрезка в искусственном интеллекте

Первоначально опубликовано на www.edureka.co 29 октября 2018 г.