bannerbanner
Сверточные нейросети
Сверточные нейросети

Полная версия

Сверточные нейросети

Настройки чтения
Размер шрифта
Высота строк
Поля
На страницу:
3 из 4

```

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

```

ReLU([-0.5, 0.8, 1.2]) = [0, 0.8, 1.2]

ReLU([0.1, -0.9, 0.5]) = [0.1, 0, 0.5]

ReLU([1.5, 2.0, -1.3]) = [1.5, 2.0, 0]

```

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

3. Пулинг (Pooling):

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

Одним из наиболее распространенных видов операции пулинга является max-pooling, который выбирает максимальное значение в определенном окне или фильтре данных. Это позволяет выделить наиболее яркие признаки из каждой области изображения, сохраняя их важность для последующего анализа. Другой распространенный тип пулинга – average-pooling, который вычисляет среднее значение всех значений в окне. Этот метод также помогает сократить размерность данных, сохраняя общие характеристики.

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

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

```

[2, 1, 0, 2]

[1, 3, 1, 0]

[0, 1, 5, 4]

[1, 2, 3, 1]

```

Допустим, мы применяем операцию max-pooling с окном размером 2x2. Это означает, что мы будем скользить окном размером 2x2 по исходной карте признаков и выбирать максимальное значение из каждого окна.

Рассмотрим первое окно:

```

[2, 1]

[1, 3]

```

Максимальное значение здесь – 3.

Перемещаем окно на одну позицию вправо и выбираем максимальное значение:

```

[1, 0]

[1, 1]

```

Максимальное значение – 1.

Продолжаем этот процесс, пока не дойдем до конца карты признаков. Результат будет выглядеть следующим образом:

```

[3, 1]

[1, 5]

```

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

4. Нормализация (Normalization):

–Нормализация играет важную роль в обучении глубоких нейронных сетей, помогая ускорить сходимость и стабилизировать процесс оптимизации. Одним из основных методов нормализации является Batch Normalization, представленный в 2015 году. Этот метод заключается в нормализации входов для каждого мини-батча данных в процессе обучения. После каждого слоя в сети данные нормализуются по среднему и дисперсии мини-батча, что способствует улучшению производительности модели и позволяет использовать более высокие темпы обучения.

Еще одним вариантом нормализации является Layer Normalization, который, в отличие от Batch Normalization, работает на уровне отдельных слоев, а не мини-батчей. Это позволяет модели быть более устойчивой к изменениям в данных и позволяет применять нормализацию даже в случае использования одиночных примеров. Кроме того, существуют и другие варианты нормализации, такие как Instance Normalization, которая работает на уровне отдельных экземпляров, и Group Normalization, которая разделяет каналы входных данных на группы и нормализует каждую группу независимо.

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

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

Процесс нормализации включает вычисление среднего значения и дисперсии активаций в каждом мини-батче данных. Допустим, у нас есть мини-батч изображений размером 32x32x3 (32 пикселя в ширину, 32 пикселя в высоту и 3 канала для цветов RGB). После применения сверточного слоя, мы получаем активации размером 32x32x64 (где 64 – количество фильтров).

Для каждого канала активации мы вычисляем среднее значение и дисперсию по всему мини-батчу. Затем мы используем эти значения для нормализации активаций. Например, если среднее значение для определенного канала составляет 0.5, а дисперсия – 1.5, то мы вычитаем 0.5 из каждого элемента активации и делим на корень из 1.5. Это приводит к тому, что активации становятся центрированными вокруг нуля и имеют стандартное отклонение, близкое к 1.

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

Пример использования Batch Normalization в сверточной нейронной сети с использованием библиотеки PyTorch:

```python

import torch

import torch.nn as nn

import torch.nn.functional as F

class ConvNet(nn.Module):

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. Мы будем скользить окном по входной матрице и вычислять среднее значение пикселей в каждом окне.       Результатом будет новая матрица с уменьшенными размерами, в которой каждый элемент представляет собой среднее значение соответствующего окна.

Получим, например:

```

[ 1.0, 1.5]

[ 2.0, 1.25]

```

В этом примере, в первом окне размером 2x2, среднее значение равно 1.0. Во втором окне также 2x2, среднее значение равно 1.25. Таким образом, операция average-pooling позволяет сократить количество данных, сглаживая изображение и сохраняя его основные черты.

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

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

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

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

Представим, у нас есть изображение размером 6x6 пикселей:

```

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

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

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

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

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

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

```

Предположим, мы применяем операцию Max-pooling с окном размером 2x2 и шагом 2. Это означает, что мы будем скользить окном размером 2x2 по изображению с шагом 2 и выбирать максимальное значение в каждом окне.

Результат Max-pooling будет следующим:

```

[[2, 2],

[2, 2]]

```

Здесь каждое значение является максимальным из соответствующего окна 2x2 в исходном изображении. Таким образом, мы уменьшили размерность изображения с 6x6 до 2x2, оставив только наиболее активные признаки.

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

Глава 3. Функции активации

– Основные функции: ReLU, Sigmoid, Tanh

– Современные функции активации: Leaky ReLU, ELU, Swish

– Влияние функций активации на обучение сети


Основные функции активации

ReLU (Rectified Linear Unit)

ReLU, или выпрямленный линейный элемент, является одной из наиболее часто используемых функций активации в современных нейронных сетях. Главной особенностью ReLU является его простота: он передает входное значение, если оно положительно, и устанавливает его в ноль, если оно отрицательно. Такая простота в вычислениях делает ReLU чрезвычайно эффективной и быстрой по сравнению с другими функциями активации, такими как Sigmoid или Tanh.

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

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

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

Пример использования ReLU

Рассмотрим пример использования функции активации ReLU в нейронной сети, реализованной с помощью библиотеки Keras на Python. В этом примере мы создадим простую полносвязную нейронную сеть для классификации рукописных цифр из набора данных MNIST.

```python

import keras

from keras.models import Sequential

from keras.layers import Dense, Flatten

from keras.datasets import mnist

from keras.utils import np_utils

# Загрузка данных MNIST

(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Нормализация входных данных

X_train = X_train.astype('float32') / 255

X_test = X_test.astype('float32') / 255

# Преобразование меток в one-hot encoding

y_train = np_utils.to_categorical(y_train, 10)

y_test = np_utils.to_categorical(y_test, 10)

# Создание модели

model = Sequential()

# Добавление слоев с функцией активации ReLU

model.add(Flatten(input_shape=(28, 28))) # Преобразование входных данных в вектор

model.add(Dense(512, activation='relu')) # Первый полносвязный слой с ReLU

model.add(Dense(512, activation='relu')) # Второй полносвязный слой с ReLU

model.add(Dense(10, activation='softmax')) # Выходной слой с softmax для многоклассовой классификации

# Компиляция модели

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Обучение модели

model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)

# Оценка модели на тестовых данных

score = model.evaluate(X_test, y_test)

print(f'Test loss: {score[0]}')

print(f'Test accuracy: {score[1]}')

```

Пояснение

1. Загрузка данных MNIST:

Мы загружаем набор данных MNIST, который состоит из изображений рукописных цифр (28x28 пикселей).

2. Нормализация входных данных:

Мы нормализуем значения пикселей, деля их на 255, чтобы привести их в диапазон от 0 до 1.

3. Преобразование меток в one-hot encoding:

Мы преобразуем метки классов в формат one-hot encoding, что необходимо для обучения модели в задачах многоклассовой классификации.

4. Создание модели:

Мы создаем последовательную модель (Sequential) и добавляем слои:

– Первый слой преобразует входные изображения в одномерный вектор.

– Два полносвязных слоя с 512 нейронами каждый и функцией активации ReLU.

– Выходной слой с 10 нейронами и функцией активации softmax для предсказания вероятностей классов.

5. Компиляция модели: Мы компилируем модель, используя функцию потерь `categorical_crossentropy`, оптимизатор `adam` и метрику `accuracy`.

6. Обучение модели: Мы обучаем модель на тренировочных данных с размером батча 128 и числом эпох 10, используя 20% данных для валидации.

7. Оценка модели: Мы оцениваем модель на тестовых данных и выводим значения потерь и точности.

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


Sigmoid

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

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

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

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

Несмотря на свои недостатки, функция активации Sigmoid все еще находит применение в современных нейронных сетях, особенно в тех случаях, когда требуется интерпретация выходных значений как вероятностей. Тем не менее, для большинства задач глубокого обучения предпочтение отдается другим функциям активации, таким как ReLU и его вариации, которые лучше справляются с проблемой затухающих градиентов и способствуют более быстрой сходимости моделей.

Пример использования Sigmoid

Рассмотрим пример использования функции активации Sigmoid в нейронной сети, реализованной с помощью библиотеки Keras на Python. В этом примере мы создадим простую нейронную сеть для задачи бинарной классификации на наборе данных Pima Indians Diabetes.

```python

import numpy as np

from keras.models import Sequential

from keras.layers import Dense

from keras.datasets import mnist

from keras.utils import np_utils

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

На страницу:
3 из 4