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

Анализ изображений

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

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

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

По крайней мере, цвет одинаковый, не так ли? Либо это…

Может ли быть хуже? Определенно может.

Хорошо, теперь хватит картинок с лебедями. Поговорим о нейронных сетях. По сути, мы очень наивно говорили об обнаружении деталей на изображениях. Исследователи создали несколько методов компьютерного зрения для решения этих проблем: SIFT, FAST, SURF, BRIEF и т. Д. Однако возникли аналогичные проблемы: детекторы были либо слишком общими, либо слишком сложными. Люди разрабатывали эти детекторы признаков, и это делало их либо слишком простыми, либо трудными для обобщения.

  • Что, если бы мы научились обнаруживать особенности?
  • Нам нужна система, которая может выполнять репрезентативное обучение (или функциональное обучение).

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

  • Неконтролируемый (K-means, PCA,…)
  • Под наблюдением (Доп. Изучение словаря, нейронные сети!)

Проблема традиционных нейронных сетей

Я предполагаю, что вы уже знакомы с традиционными нейронными сетями, называемыми многослойным персептроном (MLP). Если вы не знакомы с ними, на Medium есть сотни руководств, в которых рассказывается, как работают MLP. Они смоделированы на основе человеческого мозга, при этом нейроны стимулируются подключенными узлами и активируются только при достижении определенного порогового значения.

У MLP есть несколько недостатков, особенно когда дело касается обработки изображений. MLP используют один перцептрон для каждого входа (например, пиксель изображения, умноженный на 3 в случае RGB). Количество весов быстро становится неуправляемым для больших изображений. Для изображения 224 x 224 пикселей с 3 цветовыми каналами необходимо обучить около 150 000 весов! В результате возникают трудности при тренировках и переобучении.

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

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

Введите сверточную нейронную сеть

Я надеюсь, что случай ясен, почему MLP - ужасная идея для обработки изображений. Теперь давайте продолжим и обсудим, как можно использовать CNN для решения большинства наших проблем.

Мы анализируем влияние соседних пикселей с помощью так называемого фильтра. Фильтр - это именно то, что вы думаете, в нашей ситуации мы берем фильтр размера, указанного пользователем (эмпирическое правило 3x3 или 5x5), и перемещаем его по изображению сверху слева направо. Для каждой точки изображения вычисляется значение на основе фильтра с использованием операции свертки.

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

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

Некоторые примеры фильтров или ядер, как мы их называем, приведены ниже.

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

Просто чтобы повторить то, что мы уже обнаружили. Мы знаем, что MLP:

  • Плохо масштабируется для изображений
  • Игнорировать информацию о положении пикселей и корреляции с соседями
  • Не могу обрабатывать переводы

Общая идея CNN состоит в том, чтобы разумно адаптироваться к свойствам изображений:

  • Положение пикселя и соседство имеют семантическое значение
  • Интересующие элементы могут появиться в любом месте изображения.

CNN также состоят из слоев, но эти слои не полностью связаны: у них есть фильтры, наборы кубических весов, которые применяются по всему изображению. Каждый 2D-слой фильтров называется ядром. Эти фильтры обеспечивают инвариантность трансляции и совместное использование параметров. Как они применяются? Свертки!

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

Заполнение

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

Как нам соединить наши фильтры вместе?

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

Для ясности, каждый фильтр сворачивается со всем входным трехмерным кубом, но генерирует двухмерную карту объектов.

  • Поскольку у нас есть несколько фильтров, мы получаем трехмерный результат: одна двухмерная карта объектов для каждого фильтра.
  • Размер карты объектов может резко меняться от одного сверточного слоя к другому: мы можем войти в слой с входом 32x32x16 и выйти с выходом 32x32x128, если этот слой имеет 128 фильтров.
  • Свертка изображения с помощью фильтра создает карту функций, которая подчеркивает присутствие данной функции на изображении.

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

Представляем ReLU

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

Сравнение разных слоев

В сверточной нейронной сети есть три типа слоев: сверточный слой, слой объединения и полносвязный слой. Каждый из этих слоев имеет разные параметры, которые можно оптимизировать, и выполняет разные задачи с входными данными.

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

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

Полностью связанные слои помещаются перед выводом классификации CNN и используются для сглаживания результатов перед классификацией. Это похоже на выходной слой MLP.

Что изучают слои CNN?

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

Чтобы увидеть трехмерный пример работы CNN на практике, перейдите по следующей ссылке здесь.

Новостная рассылка

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