Изучите глубокое обучение, создав свой собственный алгоритм распознавания цифр. НЕ ТРЕБУЕТСЯ ЗАГРУЗКА.

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

К счастью для вас, эта статья станет отличным началом для изучения этих искусственных нейронных сетей! Лучший способ научиться — построить его самостоятельно!

Шаг 1

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

Платформа называется Google CoLab. Проще говоря, CoLab — это платформа, которая позволяет нам проводить машинное обучение в интерфейсе ноутбука. Блокноты (например, Jupyter) популярны в машинном обучении, поскольку они позволяют нам легко общаться и делиться своей работой!

  1. Перейдите по этой ссылке: research.colab.Google.com

2. Войти

3. Создайте новый блокнот с помощью Python3 (Новый блокнот Python3)

Шаг № 2. Давайте начнем кодировать!

На случай, если вы где-нибудь застрянете, вот ссылка на мой блокнот для справки: https://github.com/MatthewByra1/Machine_Learning_Projects/blob/master/IntroNueralNetworks.ipynb

Вы не можете заниматься машинным обучением, не имея данных для обучения. Мы будем использовать набор данных под названием MNIST. Он содержит 70000 рукописных цифр!

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

Набор данных MNIST уже разделяет наши данные для нас! Большая часть предназначена для обучения, а остальное используется для тестирования. Наши данные выглядят так:

Почерк лучше моего!

Сначала нам нужно импортировать несколько инструментов! :

import numpy as np #A math tool we can use to deal with arrays
import torch #PyTorch is the machine learning library we will use
import torchvision #Gives us access to the dataset we need
import matplotlib.pyplot as plt #Plotting tool
from torchvision import datasets, transforms
from torch import nn, optim #Neural Network optimization tool

Скопируйте и вставьте этот код в первую ячейку и нажмите SHIFT + ENTER, чтобы проверить, работает ли импорт без ошибок (без вывода).

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

C&P (скопируйте и вставьте) этот код в следующую ячейку:

transform = transforms.Compose([transforms.ToTensor(),
                              transforms.Normalize((0.5,), (0.5,))])

Теперь мы можем использовать эту переменную «преобразования» для наших данных!

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

training_set = datasets.MNIST('-/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(training_set, batch_size=64, shuffle=True)
dataiter = iter(trainloader)
images, labels = dataiter.next()

Убедитесь, что данные загружаются и работают без проблем!

Давайте посмотрим на наши данные с помощью MatPlotLib:

plt.imshow(images[1].numpy().squeeze(), cmap= "Greys_r")

Потрясающий! Наши данные импортированы, и мы можем их визуализировать!

Шаг № 2.2 — Создание вашей глубокой нейронной сети

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

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

Что означает прямая связь и почему мы ее используем? Отличный вопрос!

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

Не каждый слой срабатывает сразу. Информация передается слева направо, модифицируясь присваиваемыми весами. На каждом уровне есть пороговое значение. Если это значение соответствует сумме информации, поступающей от уровня слева, он переходит к следующему уровню. Этот процесс итеративный, он выполняется несколько раз, чтобы модель могла учиться!

Это хорошо соответствует тому, как мы учимся! Форма проб и ошибок. Мы принимаем решение, признаем проблему в этом решении и пробуем его снова и снова, пока не придем к правильному решению!

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

#784 inputs, 128  hiddenl (ReLU), 64 hidden2 (ReLU), 10 output (Softmax)
input_size = 784
hidden_sizes = [128, 64]
output_size = 10
#Build a Feed-forward network
model= nn.Sequential(nn.Linear(input_size, hidden_sizes[0]), nn.ReLU(), nn.Linear(hidden_sizes[0], hidden_sizes[1]), 
                     nn.Linear(hidden_sizes[1], output_size), nn.Softmax(dim=1))
dataiter = iter(trainloader)
images, labels = dataiter.next()
images.resize_(images.shape[0], 1, 784)
ps = model.forward(images[0, :])
#define loss function
criterion = nn.NLLLoss()
#iterate over the data
dataiter = iter(trainloader)
images, labels = dataiter.next()
#reshape data
images = images.view(images.shape[0], -1)
#Feed forward
logps = model(images)
loss = criterion(logps, labels)

Наш входной размер — это количество пикселей в одном изображении.

Наши скрытые размеры слоев относятся к размерам каждого слоя соответственно. Каждый слой имеет размер 64 изображения (найти по print(images.size)), и мы создаем два скрытых слоя для этой простой сети.

У нас есть выход 10, и мы используем функцию активации потери SoftMax, которая типична для задач распознавания.

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

Шаг 2.3 — Давайте заставим нашу модель учиться!

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

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

optimizer = optim.SGD(model.parameters(), lr=0.001)
epochs = 2
for e in range(epochs):
    running_loss = 0
    for images, labels in trainloader:
        images = images.view(images.shape[0], -1)
        optimizer.zero_grad()
        output = model(images)
        loss = criterion(output, labels)
        #Backpropagation
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    else:
        print(e, running_loss/len(trainloader))

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

correct = 0
all_counted = 0
for images,labels in trainloader:
  for i in range(len(labels)):
    img = images[i].view(1, 784)
    with torch.no_grad():
        logps = model(img)
    ps = torch.exp(logps)
    probability = list(ps.numpy()[0])
    pred_label = probability.index(max(probability))
    true_label = labels.numpy()[i]
    if(true_label == pred_label):
      correct += 1
    all_counted += 1
print("Model Accuracy =", (correct/all_counted))

Вывод

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

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

Использованная литература:

Некоторое направление для этого урока я почерпнул у Amitrajit Bose, я хотел бы призвать вас посмотреть его уроки!