Давайте начнем эту статью Руководства по PyTorch с установления того факта, что глубокое обучение - это то, что сегодня используется всеми, от виртуальной помощи до получения рекомендации при покупках! С появлением новых инструментов, позволяющих лучше использовать глубокое обучение, программирование и внедрение стали проще.
Этот учебник по PyTorch даст вам полное представление о PyTorch в следующей последовательности:
- Что такое PyTorch?
- Особенности PyTorch
- Установка PyTorch
- Мост NumPy
- PyTorch: модуль AutoGrad
- Пример использования: классификатор изображений
Фреймворки глубокого обучения в Python
Python предпочтителен для кодирования и работы с глубоким обучением и, следовательно, имеет широкий спектр фреймворков на выбор. Такие как:
- TensorFlow
- PyTorch
- Керас
- Theano
- Лазанья
Что такое PyTorch?
Это пакет для научных вычислений на основе Python, ориентированный на две группы аудитории:
- Замена для NumPy, позволяющая использовать возможности графических процессоров.
- Исследовательская платформа для глубокого обучения, обеспечивающая максимальную гибкость и скорость.
Особенности PyTorch - Основные моменты
- Встроенная поддержка Python и использование его библиотек
- Активно используется в разработке Facebook для выполнения всех требований платформы по глубокому обучению.
- PyTorch обеспечивает простой в использовании API, который помогает упростить использование и лучшее понимание при использовании API.
- Графики динамических вычислений являются здесь основным преимуществом, поскольку они обеспечивают динамическое построение графа - в каждой точке выполнения кода граф строится вместе, и им можно манипулировать во время выполнения.
- PyTorch работает быстро и кажется родным, что обеспечивает простое кодирование и быструю обработку.
- Поддержка 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
Мы сделаем следующие шаги по порядку:
- Загрузка и нормализация CIFAR10
- Определите сверточную нейронную сеть
- Определите функцию потерь
- Обучите сеть на обучающих данных
- Протестируйте сеть на тестовых данных
Загрузка и нормализация 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.
Обязательно обратите внимание на другие статьи в этой серии, которые объяснят различные другие аспекты глубокого обучения.
17. Q Learning
18. Априорный алгоритм.
23. Вопросы на собеседовании по искусственному интеллекту (ИИ)
Первоначально опубликовано на www.edureka.co 29 октября 2018 г.