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

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

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

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

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

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

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

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

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

И на практике эта операция называется просто сверткой, что уступает место названию «Сверточная нейронная сеть», о котором мы поговорим позже.

Давайте сначала подумаем о более высоком уровне, предположим, что у нас есть фильтр 4X4, что означает, что у нас есть 16 различных весов. Мы собираемся применить один и тот же фильтр из патчей 4X4 ко всему входному изображению. И мы будем использовать результат этой операции для определения состояния нейронов в следующем скрытом слое.

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

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

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

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

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

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

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

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

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

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

1. Сначала поместите этот патч поверх входного изображения того же размера. Итак, мы размещаем этот патч (изображение выше) в верхнем левом углу, в этой части изображения, выделенной зеленым цветом на крестике X, и выполняем поэлементное умножение.

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

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

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

Предположим, мы хотим вычислить свертку этого зеленого изображения 5X5 с помощью этого фильтра или патча 3X3.

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

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

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

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

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

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

Итак, давайте возьмем пример этого изображения слева (исходное изображение). Если вы проведете по нему разными фильтрами, вы сможете получить разные выходные карты функций. Например, вы можете повысить резкость этого изображения с помощью фильтра, показанного во 2-м столбце, вы можете обнаружить края на этом изображении, используя фильтр 3-го столбца 7, вы можете обнаружить еще более сильные края, имея 4-й столбец.

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

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

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

Теперь, когда мы поняли, что такое свертка, давайте воспользуемся этим для построения нейронных сетей полной свертки для решения задач компьютерного зрения. CNN уместно названо Convolution Neural Networks, потому что их основой является операция свертки.

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