Вы когда-нибудь задумывались о том, что биология связана с популярными и популярными в настоящее время терминами? Современные термины, которые сейчас в тренде, возникли очень давно. Точно так же и с глубоким обучением. Нервная система человека состоит из клеток, которые имеют нейроны. Нейроны состоят в основном из трех частей: тела клетки, аксона и дендритов. Эти части играют решающую роль в передаче сообщений. Связь между аксоном и дендритами относится к синапсам. Оставим в стороне биологическую нейронную сеть и сконцентрируемся на искусственных нейронных сетях.

На следующем рисунке показано, как выглядят нейроны мозга человека:

Что такое глубокое обучение?

Глубокое обучение восходит к 1980-м годам. Причина, по которой он формируется сегодня, - это достижения в области технологий. Для функционирования Deep Learning данные являются ключом, а также вычислительной мощностью. Джеффри Хинтон - отец глубокого обучения.

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

Итак, когда мы можем назвать это глубоким обучением?

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

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

Модель глубокого обучения требует огромных обучающих данных для обучения и прогнозирования. Кроме того, для вычисления модели требуется большая вычислительная мощность. Таким образом, графические процессоры (графические процессоры) используются для глубокого обучения из-за огромного объема данных и высокой пропускной способности памяти (750 ГБ / с против всего 50 ГБ / с, предлагаемых традиционными процессорами).

Традиционные процессоры могут работать с моделями DL, но обучение модели требует больше времени и работает медленно 😲.

Согласно закону Мура, количество транзисторов на MicroChip удваивается каждые 2 года, хотя стоимость компьютеров снижается вдвое.

Поле глубокого обучения имеет множество подполей, таких как искусственная нейронная сеть, сверточная нейронная сеть, рекуррентная нейронная сеть и т. Д.

Давайте сконцентрируемся на CNN.

Мы используем PyTorch для классификации изображений Fashion MNIST.

Что такое CNN?

CNN расшифровывается как Convolution Neural Network. Как мы уже обсуждали ранее, для глубокого обучения требуется огромный объем данных для прогнозирования, а также высокая вычислительная мощность для обработки. Раньше CNN мы использовали для прогнозирования текстовых, числовых данных и т. Д.

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

Операция Свертка - это операция скалярного произведения между набором весов со структурой сетки и изображениями со структурой сетки.

Сверточное изображение задается:

Z = W * X + b, где W-размер ядра, X-входное изображение, b-смещение

Размер ядра может быть определен пользователем, или Pytorch может назначать значения автоматически, если пользователь не передает никаких входных данных для kernel_size.

X - входное изображение, состоящее из пикселей изображения определенного размера.

Набор данных Fashion MNIST

Мы используем набор данных Fashion MNIST для классификации изображений, предоставленных исследованием Zalando. Набор данных состоит из 60K обучающих изображений и 10K тестовых изображений в оттенках серого с разрешением 28 X 28 пикселей. Данные по обучению и тестированию включают в себя ярлыки классов 0–9 с футболками, брюками, платьями, пальто и т. Д.

Архитектура CNN

Ниже представлена ​​типичная архитектура CNN, где изображение передается ядру с некоторыми параметрами, затем o / p передается в карту активации, а затем в функцию активации, что приводит к выходу. Обсудим каждую часть подробно.

1. Размер ядра:

На рис. I обозначает входное изображение, K обозначает ядро. Kernel_size дает размер матрицы, и когда мы передаем ядро ​​изображению, то на выходе получается произведение значений ядра и значений сетки. Этот процесс продолжается во всех сетках.

2. Шаг:

Шаг - это количество сдвигов пикселей по входной матрице. когда шаг равен 2, мы перемещаем фильтры (ядро) на 2 пикселя за раз и так далее.

3. Заполнение:

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

4. Карта активации (Z): Выходные данные ядра (K) и входные данные (X) приводят к появлению карты активации. Другими словами, карта активации позволяет нам увидеть, какие области изображения относятся к этому классу.

5. Максимальное количество пулов (если Kernel_Size = None):

Максимальное объединение уменьшает размер карты активации и изображения. мы можем выбрать размер ядра в классе Maxpool2D. Ядро перемещается по карте активации и выдает максимальное значение в сетке.

6. Функция активации:

Функция активации обозначает вывод Карты активации на основе некоторых критериев. У нас есть много типов функций активации, таких как сигмовидная функция, ReLU, tanh и т. Д. Из всего этого, RELU является наиболее часто используемой функцией активации в нейронных сетях, особенно в CNN.

RELU определяется как выпрямленная линейная единица. Математически определяется как y = max (0, x). Любое отрицательное число на карте активации преобразуется в 0, а положительное число остается прежним.

Это типичная архитектура, а затем мы создаем модель для CNN.

Импортировать необходимые библиотеки:

from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
import torch 
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as dsets
torch.manual_seed(0)
import pandas as pd
import numpy as np
#Other non-PyTorch Modules
from matplotlib.pyplot import imshow
import matplotlib.pylab as plt
from PIL import Image

Образец изображения:

for n,data_sample in enumerate(dataset_test):
show_data(data_sample)
    plt.show()
    if n==2:
        break

Модель CNN:

Из приведенного ниже кода мы создадим конструктор CNN, сохранив скорость обучения 0,1.

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

#Building CNN Constructor  
class CNN(nn.Module):
    
    # Contructor
    def __init__(self, out_1=16, out_2=32,number_of_classes=10):  #No. of classes is 10
        super(CNN, self).__init__()
        self.cnn1 = nn.Conv2d(in_channels=1, out_channels=out_1, kernel_size=5, padding=2)
        self.maxpool1=nn.MaxPool2d(kernel_size=2)
self.cnn2 = nn.Conv2d(in_channels=out_1, out_channels=out_2, kernel_size=5, stride=1, padding=2)
        self.maxpool2=nn.MaxPool2d(kernel_size=2)
        self.fc1 = nn.Linear(out_2 * 4 * 4, number_of_classes)
    
    # Prediction
    def forward(self, x):
        x = self.cnn1(x)
        x = torch.relu(x)
        x = self.maxpool1(x)
        x = self.cnn2(x)
        x = torch.relu(x)
        x = self.maxpool2(x)
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x
# Creating a model 
model = CNN(out_1=16, out_2=32,number_of_classes=10)
# Optimizer
criterion = nn.CrossEntropyLoss() 
learning_rate = 0.1 
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)   # we use Stochastic Gradient Descent 
train_loader = torch.utils.data.DataLoader(dataset=dataset_train, batch_size=100)
test_loader = torch.utils.data.DataLoader(dataset=dataset_test, batch_size=4000)

Обучение модели CNN:

Обучим модель CNN с 5 эпохами. Эпоха означает один цикл полного набора обучающих данных.

# Train the Model
import time
start_time = time.time()
cost_list=[]
accuracy_list=[]
N_test=len(dataset_test)
n_epochs=5
for epoch in range(n_epochs):
    cost=0
    model.train()
    for x, y in train_loader:
        optimizer.zero_grad()
        z = model(x)
        loss = criterion(z, y)
        loss.backward()
        optimizer.step()
        cost+=loss.item()
    correct=0
    #perform a prediction on the validation  data 
    model.eval()
    for x_test, y_test in test_loader:
        z = model(x_test)
        _, yhat = torch.max(z.data, 1)
        correct += (yhat == y_test).sum().item()
    accuracy = correct / N_test
    accuracy_list.append(accuracy)
    cost_list.append(cost)

Точность графика и стоимость:

#Plotting Accuracy & Cost
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.plot(cost_list, color=color)
ax1.set_xlabel('epoch', color=color)
ax1.set_ylabel('Cost', color=color)
ax1.tick_params(axis='y', color=color)
     
ax2 = ax1.twinx()  
color = 'tab:blue'
ax2.set_ylabel('accuracy', color=color) 
ax2.set_xlabel('epoch', color=color)
ax2.plot( accuracy_list, color=color)
ax2.tick_params(axis='y', color=color)
fig.tight_layout()

На рисунке мы получили точность 86% с 4 эпохами, стоимость 216. Мы видим, что, прогнав 4 эпохи, стоимость уменьшилась с 450 до 216.

Итак, для набора данных Fashion MNIST мы достигли точности 86%, что достаточно хорошо. Вот как мы разрабатываем модель CNN с помощью Pytorch.

Чтобы увидеть весь код, проверьте предоставленную ссылку на Github…