В этой статье рассказывается об архитектуре и работе сверточных нейронных сетей (CNN). Начнем с вопроса - зачем нам CNN?

CNN и MLP. Прежде чем мы начнем сравнивать, давайте рассмотрим пример, в котором у нас есть набор изображений в градациях серого, и каждое из этих изображений представляет собой число от 0 до 9. Как мы знаем, эти изображения интерпретируются как матрица пикселей, где каждый пиксель имеет номер от 0 до 255. Для простоты мы можем считать, что размер каждого изображения в градациях серого составляет 4 * 4 пикселя. В примере, показанном ниже, есть цифра 7.

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

Мы передаем этот одномерный 16-элементный вектор в качестве входных данных для MLP. Обратите внимание, что это больше не сохраняет пространственную информацию, то есть MLP не знает, что пиксели, расположенные ближе друг к другу, имеют какое-то отношение, чем те пиксели, которые не находятся рядом друг с другом. Напротив, CNN могут принимать в качестве входных данных двумерную матрицу. Таким образом, в CNN нет потери пространственной информации.

Подключение к узлу. Давайте возьмем следующий пример MLP, где у нас есть:

  • входной слой с 16 узлами - по одному узлу на каждый пиксель
  • один скрытый слой с 4 узлами
  • выходной слой с 10 узлами - каждый узел сообщает вероятность для одного числа (от 0 до 9)

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

Давайте углубимся в эту концепцию на примере того же изображения в оттенках серого 4 * 4. У нас есть 16 входных узлов, и мы делим их на группу из 4, где каждая группа имеет свой цвет. Каждая из этих групп связана с одним узлом в скрытом слое, который имеет такую ​​же цветовую кодировку, как и группа входных узлов, как показано ниже:

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

Архитектура сверточной нейронной сети

Рассматривая то же изображение в оттенках серого 4 * 4, что и в нашем примере, мы сначала берем окно некоторого размера, называемое сверточным окном. Затем мы перемещаем это окно по горизонтали и вертикали по изображению, вычисляя значение на каждом шаге, которое присваивается одному узлу скрытого слоя. Количество пикселей, на которое сверточное окно перемещается по изображению на каждом шаге, называется шагом. В приведенном ниже примере показано сверточное окно 2 * 2 с шагом = 2.

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

Может быть несколько наборов скрытых узлов, и каждый набор известен как карта активации или карта функций. Каждая карта функций имеет отдельное окно фильтра. Обратите внимание, что количество фильтров равно количеству карт характеристик, и набор этих карт характеристик дает нам сверточный слой, то есть каждый сверточный слой может иметь N карт характеристик, и каждая карта характеристик сообщает нам некоторый образец изображения. Далее мы можем передать этот сверточный слой другому сверточному слою, чтобы получить узоры в узорах изображения. В приведенном ниже примере есть два фильтра (Фильтр 1 и Фильтр 2), и, как мы видим, он дает нам две карты активации размером 2 * 2, каждая для одного фильтра (обратите внимание, что сверточное окно составляет 2 * 2 и шаг = 2).

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

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

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

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

Максимальный уровень объединения. Как и сверточное окно, максимальный уровень объединения связан с максимальным окном объединения, которое перемещается по горизонтали и вертикали по каждой карте объектов в сверточном слое. Давайте рассмотрим следующий пример, где максимальный слой объединения принимает сверточный слой с 3 картами характеристик (4 * 4) в качестве входных данных. Размер максимального окна объединения составляет 2 * 2, а шаг - 2. Учитывая, как слой объединения работает на одной карте объектов ниже:

Мы начинаем с верхнего левого угла и на каждом шаге (stride = 2) выбираем максимальное значение узлов в пределах окна максимального объединения и назначаем это значение одному узлу карты функций. Этот процесс уменьшает размер карты функций с 4 * 4 до 2 * 2. Сверточный слой может иметь несколько карт функций, и передача сверточного слоя с 3 картами функций в качестве входных данных для максимального слоя объединения может выглядеть примерно так, как показано ниже, где размер каждой карты функций уменьшается.

Слой Global Average Pooling - уменьшает размер каждой карты объектов до 1 * 1, поскольку принимает среднее значение всех узлов в карте объектов. Можно сказать, что это более радикальный вариант уменьшения размерности, как показано ниже.

Мы узнали о сверточных слоях и слоях пула. CNN состоит в основном из этих двух слоев, где каждому слою объединения предшествует сверточный слой. Учитывая случай классификации изображений, входной массив всегда будет намного выше и шире, чем он глубокий (например, используемое изображение в градациях серого имеет входную форму 4 * 4 * 1). Глубина изображения в градациях серого равна 1, а глубина цветного изображения - 3. Целью CNN будет взять входной массив и извлечь всю пространственную информацию, сделав массив более глубоким (больше фильтров - больше карт функций) и уменьшив высоту и ширину по мере продвижения к решению. В конце концов, пространственная информация (какой пиксель расположен рядом с каким пикселем) больше не должна иметь значения. Скорее, он должен уметь получать ответы на такие вопросы, как - есть ли колесо? есть хвост? и т.д. Затем мы подключаем его к полностью связанному слою, чтобы определить, какой объект содержится в изображении. Сверточные слои делают массив глубоким за счет использования нескольких фильтров, а слои объединения уменьшают размер, как показано ниже:

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