Глубокое погружение в сверточные нейронные сети, часть 1:

Руководство для начинающих по слоям сверточной нейронной сети

Введение

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

Сверточная нейронная сеть — это глубокая нейронная сеть, используемая в компьютерном зрении для извлечения признаков изображения. Архитектура сверточной нейронной сети включает в себя множество взаимосвязанных слоев, включая свертку, объединение и полносвязные слои.

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

Чтобы легко понять эту статью, читатель должен иметь базовые знания о следующем:

  • Программирование на Питоне
  • Нейронные сети
  • Обработка изображений

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

В следующих разделах этой статьи будут объяснения этих слоев. К концу статьи вы поймете ключевые уровни архитектуры CNN.

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

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

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

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

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

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

H = [(h — F + 2P) / S]+1

Где H = высота матрицы признаков, h = высота входной матрицы, F = высота матрицы фильтра, P = заполнение и S = ​​шаг.

CNN использует сверточный слой для захвата пространственных паттернов и иерархических представлений в изображении. Пространственные шаблоны и иерархические представления включают в себя края, углы, текстуры и т. д. Независимо от их положения или масштаба на изображении, CNN распознает объекты или шаблоны с помощью сверточного слоя. Мы называем эту роль «пространственной инвариантностью».

Реализация сверточного слоя с Tensorflow

Чтобы построить архитектуру CNN с помощью пакета TensorFlow, мы используем функцию CONV2D, присутствующую в пакете. Эта функция принимает следующие параметры:

  • Количество фильтров,
  • Форма фильтра,
  • Функция активации,
  • Обивка,
  • Шаги и
  • Форма ввода.

Синтаксис представляет сверточный слой

import tensorflow as tf    # Importing tensorflow model.
# Syntax for the convolutional layer
tf.keras.layers.Conv2D(num_filters, filter_shape, activation, padding, strides, input_shape)

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

Без функций активации CNN может изучать только линейные отношения. Функция активации позволяет ему изучать сложные и нелинейные отношения. Наиболее распространенные функции активации в CNN включают softmax, ReLU и сигмоид.

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

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

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

Заполнение вводит дополнительные пиксели по сторонам входной карты объектов перед сверткой. Существует два метода заполнения: «То же заполнение» и «Действительное заполнение».

Same-Padding добавляет пустые пиксели к сторонам входной карты объектов, чтобы она имела ту же форму, что и выходная карта объектов. Нулевой отступ, наиболее распространенный, добавляет пиксели со значениями 0 к краю фильтра. На изображении ниже показано, как выполняется этот метод заполнения.

Чтобы получить количество пикселей, которое будет заполнено отступом, в зависимости от размера фильтра, используемого в сверточном слое,

заполнение = (F-1)/2

Если сверточный слой принимает размер фильтра (5, 5), этот метод дополняет два пикселя на основе формулы. Чтобы назначить нулевое заполнение сверточному слою, для параметра заполнения задается синтаксис padding = "same".

В случае допустимого отступа к пикселям не добавляется отступ; фильтр проходит только по действительным пикселям. По бокам карты входных объектов не происходит никаких отступов. Параметр заполнения установлен на «действительный» с синтаксисом как padding = "valid".

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

H = [(h — F) / S] + 1

Где H = высота матрицы признаков, h = высота входной матрицы, F = высота матрицы фильтра и S = ​​шаг.

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

В следующем разделе будет объяснено значение слоев объединения, их роли и их реализация с использованием TensorFlow.

Объединение слоев

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

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

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

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

В случае операции объединения сумм вычисляется общая сумма значений отдельных пикселей в области. Эта сумма представляет собой новый пиксель выходной карты объектов.

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

среднее значение = [a+b+c+…..+d] / n

Где a, b, c и d — значения пикселей на входной карте объектов, а n — общее количество пикселей в охваченной области.

Необходимо понять, как эту операцию можно реализовать с помощью TensorFlow. Эта тема будет дополнительно обсуждаться в подразделе.

Реализация операции объединения с помощью Tensorflow.

В зависимости от выбора Tensorflow предлагает класс, который позволяет пользователям использовать различные виды операций объединения. В этой статье описан синтаксис описанной выше операции объединения.

Все три операции объединения принимают один параметр — форму объединения. Форма пула — это размер фильтра, который скользит по карте объектов.

Синтаксис каждой из операций

# Max Pooling Layer
tf.keras.layers.MaxPooling2D(pooling_shape)
# Average Pooling Layer
tf.keras.layers.AvgPooling2D(pooling_shape)
# Sum Pooling Layer 
tf.keras.layers.SumPooling2D(pooling_shape)

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

Полносвязный слой

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

Полносвязный слой состоит из плоского слоя и плотного слоя. Карты объектов, извлеченные из окончательного сверточного слоя или слоя объединения, остаются двумерным массивом. Задача плоского слоя — преобразовать извлеченную карту объектов в одномерный массив.

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

Реализация полносвязного слоя

Полносвязный слой можно легко реализовать с помощью TensorFlow. Хотя плоский слой не имеет параметров, плотный слой принимает несколько параметров.

Основными параметрами, которые учитывает плотный слой, являются единицы измерения и функция активации. Параметр unit определяет размер вывода из плотного слоя. Как объяснялось в разделе «Реализация сверточного слоя», плотный слой также принимает на себя функцию активации и выполняет ту же задачу.

Эти синтаксисы выполняют роли плоского и плотного слоев.

# Flatten Layer
tf.keras.layers.Flatten()
# Dense Layer
tf.keras.layers.Dense(units, activation)

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

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

Построение простой архитектуры сверточной нейронной сети.

Архитектура сверточной нейронной сети представляет собой расположение слоев. Различные современные модели создаются путем эффектного объединения этих различных слоев вместе.

Способ расположения различается для разных моделей. Чтобы придумать простую архитектуру CNN, которую можно использовать в задаче распознавания изображений, можно использовать Sequential API от Tensorflow.

Модель будет содержать пять сверточных слоев и четыре максимальных слоя объединения. Затем извлеченные карты объектов сглаживаются с помощью слоя Flatten. Плотный слой выполняет задачу распознавания и выводит окончательный класс изображения. Ниже приведен код, который строит эту модель.

# importing Python libraries.
from tensorflow.keras import Sequential, layers

# the Sequential model is defined
model = Sequential([
    layers.Conv2D(16, (3,3), activation= 'relu', input_shape =(150, 150, 3)),
    layers.MaxPooling2D(2,2),
    layers.Conv2D(32, (3,3), activation='relu', padding=same, stride=2),
    layers.MaxPooling2D(2,2),
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.MaxPooling2D(2,2),
    layers.Conv2D(64, (3,3), activation='relu', padding=same, stride=2),
    layers.MaxPooling2D(2,2),
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.Flatten(),
    layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu')
    layers.Dense(1,activation= 'sigmoid'),
])

Слои в модели показывают, как слои CNN могут быть сложены и как параметры установлены в каждом слое. При работе над проектом по распознаванию изображений эта модель может служить ориентиром для построения модели читателя. Модель можно дополнительно обучить, чтобы повысить показатель точности.

Заключение

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

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

Эта серия будет продолжать объяснять, как обращаться с данными для задачи классификации изображений.

Ссылка

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