PyTorch - сверточная нейронная сеть
Глубокое обучение - это раздел машинного обучения, который считается важным шагом, предпринятым исследователями в последние десятилетия. Примеры реализации глубокого обучения включают такие приложения, как распознавание изображений и распознавание речи.
Ниже приведены два важных типа глубоких нейронных сетей:
- Сверточные нейронные сети
- Рекуррентные нейронные сети.
В этой главе мы сосредоточимся на первом типе, то есть на сверточных нейронных сетях (CNN).
Сверточные нейронные сети
Сверточные нейронные сети предназначены для обработки данных через несколько уровней массивов. Этот тип нейронных сетей используется в таких приложениях, как распознавание изображений или распознавание лиц.
Основное отличие CNN от любой другой обычной нейронной сети состоит в том, что CNN принимает входные данные как двумерный массив и работает непосредственно с изображениями, а не фокусируется на извлечении признаков, на котором сосредоточены другие нейронные сети.
Доминирующий подход CNN включает решение проблем распознавания. Ведущие компании, такие как Google и Facebook, инвестировали в исследовательские и опытно-конструкторские разработки проектов признания, чтобы сделать деятельность более быстрой.
Каждая сверточная нейронная сеть включает в себя три основных идеи:
- Местные соответствующие поля
- Convolution
- Pooling
Давайте разберемся с каждой из этих терминов подробно.
Местные соответствующие поля
CNN использует пространственные корреляции, существующие во входных данных. Каждый в параллельных слоях нейронных сетей соединяет несколько входных нейронов. Этот конкретный регион называется локальным восприимчивым полем. Он фокусируется только на скрытых нейронах. Скрытый нейрон будет обрабатывать входные данные внутри указанного поля, не осознавая изменений за пределами определенной границы.
Представление диаграммы генерации локальных соответствующих полей упомянуто ниже -
Свертка
На приведенном выше рисунке мы видим, что каждое соединение изучает вес скрытого нейрона с соответствующей связью с перемещением из одного слоя в другой. Здесь отдельные нейроны время от времени совершают сдвиги. Этот процесс называется «сверткой».
Сопоставление подключений входного слоя к карте скрытых функций определяется как «общие веса», а включенное смещение называется «общим смещением».
Объединение
Сверточные нейронные сети используют уровни объединения, которые располагаются сразу после объявления CNN. Он принимает вводимые пользователем данные в виде карты характеристик, которая выводит сверточные сети и подготавливает сжатую карту характеристик. Объединение слоев помогает в создании слоев с нейронами предыдущих слоев.
Реализация PyTorch
Следующие шаги используются для создания сверточной нейронной сети с использованием PyTorch.
Шаг 1
Импортируйте необходимые пакеты для создания простой нейронной сети.
from torch.autograd import Variable
import torch.nn.functional as F
Шаг 2
Создайте класс с пакетным представлением сверточной нейронной сети. Форма нашей партии для ввода x имеет размер (3, 32, 32).
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
#Input channels = 3, output channels = 18
self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
#4608 input features, 64 output features (see sizing flow below)
self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
#64 input features, 10 output features for our 10 defined classes
self.fc2 = torch.nn.Linear(64, 10)
Шаг 3
Вычислите активацию изменения первого размера свертки от (3, 32, 32) до (18, 32, 32).
Размер измерения изменяется с (18, 32, 32) на (18, 16, 16). Измените размер данных входного слоя нейронной сети, в результате чего размер изменится с (18, 16, 16) на (1, 4608).
Напомним, что -1 выводит это измерение из другого заданного измерения.
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = x.view(-1, 18 * 16 *16)
x = F.relu(self.fc1(x))
#Computes the second fully connected layer (activation applied later)
#Size changes from (1, 64) to (1, 10)
x = self.fc2(x)
return(x)