Литмир - Электронная Библиотека

def __init__(self):

super(ConvNet, self).__init__()

self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)

self.bn1 = nn.BatchNorm2d(64) # Batch Normalization после первого сверточного слоя

self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)

self.bn2 = nn.BatchNorm2d(128) # Batch Normalization после второго сверточного слоя

self.fc1 = nn.Linear(128 * 16 * 16, 256)

self.fc2 = nn.Linear(256, 10)

def forward(self, x):

x = F.relu(self.bn1(self.conv1(x)))

x = F.max_pool2d(x, kernel_size=2, stride=2)

x = F.relu(self.bn2(self.conv2(x)))

x = F.max_pool2d(x, kernel_size=2, stride=2)

x = x.view(-1, 128 * 16 * 16)

x = F.relu(self.fc1(x))

x = self.fc2(x)

return x

# Создаем экземпляр сети

model = ConvNet()

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

criterion = nn.CrossEntropyLoss()

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# Пример обучения на некоторых данных

for epoch in range(num_epochs):

for images, labels in train_loader:

optimizer.zero_grad()

outputs = model(images)

loss = criterion(outputs, labels)

loss.backward()

optimizer.step()

```

Это простой пример сверточной нейронной сети с Batch Normalization после каждого сверточного слоя. Важно отметить, что в PyTorch Batch Normalization включается просто путем добавления слоя `nn.BatchNorm2d` после сверточного слоя, как показано в примере.

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

Глава 2. Свертка и пулинг

– Свойства и операции свертки

– Различные виды пулинга: max-pooling, average-pooling

– Роль и преимущества пулинга в CNN

Сверточные нейронные сети (CNN) используют свертку и пулинг для эффективного извлечения признаков из входных данных, таких как изображения. Вот более подробное объяснение этих концепций:

Свойства и операции свертки

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

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

– Stride (шаг) – это шаг, с которым ядро свертки перемещается по входному изображению. Он определяет расстояние между применениями фильтра к входным данным и влияет на размер выходного изображения.

Давайте рассмотрим пример применения операции свертки на входном изображении.

Предположим, у нас есть следующее изображение размером 5x5 пикселей:

```

[[1, 2, 1, 0, 0],

[0, 1, 0, 2, 1],

[1, 0, 2, 1, 0],

[0, 1, 0, 1, 0],

[1, 2, 1, 0, 0]]

```

Также у нас есть фильтр (ядро свертки) размером 3x3:

```

[[1, 0, 1],

[0, 1, 0],

[1, 0, 1]]

```

Мы будем применять этот фильтр к изображению с определенным шагом (stride), чтобы получить выходное изображение (feature map).

Пусть наш шаг (stride) будет равен 1.

Тогда, начиная с верхнего левого угла изображения, мы будем перемещать наш фильтр по всей области изображения и вычислять скалярное произведение между значениями пикселей изображения и значениями фильтра. Затем полученное значение будет записано в соответствующую позицию на выходном изображении (feature map).

Процесс будет продолжаться до тех пор, пока фильтр не пройдет по всему изображению. Если шаг (stride) больше 1, фильтр будет перемещаться с большим интервалом, что приведет к уменьшению размерности выходного изображения.

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

Различные виды пулинга

 Max-pooling

Max-pooling является одной из ключевых операций в сверточных нейронных сетях (CNN). Он применяется после операции свертки для уменьшения размерности данных, сохраняя при этом наиболее важные признаки изображения или карт признаков. В основном, max-pooling используется для уменьшения вычислительной нагрузки и количества параметров модели, а также для предотвращения переобучения.

Операция max-pooling выполняется путем сканирования окна определенного размера (например, 2x2 или 3x3) по входной матрице (например, карты признаков) и выбора максимального значения из каждого окна. При этом окно перемещается с определенным шагом (stride) по входным данным. Результатом этой операции является новая матрица с уменьшенными размерами, содержащая наиболее активные признаки из исходных данных.

Max-pooling помогает модели выявить наиболее важные признаки изображения, такие как края, текстуры и общие паттерны, сохраняя при этом пространственную инвариантность. Это особенно полезно для задач распознавания объектов на изображениях, где расположение объекта в кадре может изменяться.

Представим, у нас есть входная матрица размером 4x4, которая представляет собой карту признаков после операции свертки:

```

[ 1, 2, 1, 0]

[ 0, 1, 2, 3]

[ 3, 0, 1, 2]

[ 2, 4, 0, 1]

```

Применим операцию max-pooling с окном размером 2x2 и шагом 2 (stride). Мы будем скользить окном по входной матрице и выбирать максимальное значение в каждом окне. Результатом будет новая матрица с уменьшенными размерами:

```

[ 2, 3]

[ 4, 2]

```

В этом примере, в первом окне размером 2x2, максимальное значение равно 3. Во втором окне, также 2x2, максимальное значение равно 4. Таким образом, операция max-pooling уменьшает размерность входных данных, оставляя наиболее активные и значимые признаки.

 Average-pooling

Операция average-pooling является одним из ключевых элементов сверточных нейронных сетей (CNN). Её целью является уменьшение размерности данных после операции свертки, что позволяет сети извлекать более обобщенные признаки из изображений и сократить количество параметров, что способствует более эффективному обучению и уменьшает риск переобучения.

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

Для CNN операция average-pooling имеет несколько важных ролей. Во-первых, она помогает уменьшить вычислительную нагрузку и количество параметров в сети, что делает обучение более эффективным. Во-вторых, она улучшает инвариантность к масштабу и переносу, что означает, что сеть может лучше распознавать объекты в различных частях изображения или изображениях разного размера. Также, снижение размерности позволяет сети сосредоточиться на более важных признаках, игнорируя менее значимые детали.

Например, предположим, у нас есть входная матрица размером 4x4 после операции свертки:

```

[ 1, 2, 1, 0]

[ 0, 1, 2, 3]

[ 3, 0, 1, 2]

[ 2, 4, 0, 1]

```

Применим операцию average-pooling с окном размером 2x2 и шагом 2. Мы будем скользить окном по входной матрице и вычислять среднее значение пикселей в каждом окне.       Результатом будет новая матрица с уменьшенными размерами, в которой каждый элемент представляет собой среднее значение соответствующего окна.

8
{"b":"909662","o":1}