Сверточные нейронные сети демистифицированы без какого-либо причудливого технического жаргона!

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

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

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

Часть 0: Что такое CNN? Зачем нам это использовать?

Так зачем нам использовать CNN вместо нейронной сети другого типа, скажем, многослойного перцептрона? Это связано с тем, что CNN могут извлекать особенности изображения, чего не может сделать такой алгоритм, как многослойный перцептрон (MLP) или рекурсивная нейронная сеть (RNN).

Архитектура сверточной нейронной сети выглядит примерно так:

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

Часть 1: Распознавание изображений

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

Свертка

Фильтр - это матрица, которая извлекает элементы из изображения (именно здесь происходит обучение). Скалярный продукт между значениями фильтра и значениями пикселей изображения образует сверточный слой.

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

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

Поскольку фильтр в первом слое используется для обнаружения объекта, который можно легко распознать, это может быть восьмиугольная форма знака остановки. Фильтр на втором уровне будет использоваться для обнаружения чего-то более конкретного, например, текста «СТОП». Фильтр третьего уровня может использоваться для обнаружения чего-то еще более конкретного, например буквы «S» в слове «STOP».

В Keras (фреймворк глубокого обучения в Tensorflow) код для первого слоя свертки будет выглядеть примерно так:

Примечание. Я не буду вдаваться в подробности того, как работает код, но немного расскажу об архитектуре.

Итак, мой сверточный слой имеет размер 16 X 16 X 3 с фильтром 5 X 5. Программист должен явно определить размеры фильтра, но значения в фильтре самоизучиваются сетью.

Объединение

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

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

Re-Lu

А теперь давайте углубимся в математику. Re-Lu (Rectified Linear Unit) - обычная функция активации, используемая в нейронных сетях. Функция активации используется для добавления нелинейности нейронной сети. Это позволяет нам решать гораздо более сложные проблемы, чем если бы наша сеть была просто линейной функцией. Если бы у нас никогда не было функции активации в нашей сети, это был бы простой алгоритм линейной регрессии.

Функция активации Re-Lu - это функция, которая будет возвращать значения только в том случае, если значение больше нуля, что помогает сократить время обучения.

Часть 2: Классификация изображений

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

В полностью связанном слое каждый нейрон имеет общую связь со всеми другими нейронами в слое до и после него. Вот почему он называется «полностью подключенным» слоем. Вот как они выглядят:

Сплющивание

Прежде чем вводить наш запутанный ввод в плотный (полностью связанный) слой, мы должны сгладить тензор (наш ввод). Сглаживание превращает наш многомерный входной тензор в одномерный входной тензор. Например, предположим, что последний сверточный слой выводит тензор (28, 28, 3). Сглаживание этого вывода даст следующему слою входные данные (2352, 1). 2352 получается из умножения 28 X 28 X 3, которые являются размерностями предыдущего выходного тензора.

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

Выбывать

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

Часть 3: Обучение сети

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

Функция потерь

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

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

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

Формула, указанная там, включает в себя некоторые действительно сложные математические обозначения, поэтому, если вы хотите углубиться в математику, я предлагаю вам перейти по ссылке ниже. Однако вам не нужно хорошо владеть математикой для написания CNN (особенно в таких фреймворках, как Keras или Pytorch, поскольку вам нужно только написать «loss = cross_entropy», и Keras / Pytorch будет позаботьтесь об остальном).

Оптимизация

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

Если вы действительно хотите узнать больше об оптимизаторе Adam, наденьте свои статистические и вычислительные шлемы и нажмите на ссылку ниже.



Как и раньше, вам не нужно разбираться в математике, лежащей в основе работы оптимизатора. В Keras использование оптимизатора Adam - это буквально одна строка кода (optimizer = «Adam»)

Вот и все!

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



Ключевые выводы

Чтобы подвести итог всему этому:

  • CNN - это тип глубокой нейронной сети, которая часто используется для обработки данных изображений и для сложных задач классификации.
  • Архитектура CNN включает в себя различные типы уровней, в том числе: свертку, максимальное объединение, плотное, выпадение.
  • Слои свертки извлекают информацию о характеристиках из изображения, умножая матрицу фильтра на тензор изображения, создавая фильтрованный слой изображения. Здесь происходит все обучение
  • Затем отфильтрованный слой объединяется (размер отфильтрованного слоя уменьшается). Это делается с помощью Максимального объединения.
  • После того, как изображение проходит через пару слоев свертки + максимального объединения, оно становится сглаженным и переходит в слой Плотный.
  • После того, как плотный слой делает свое дело, пара нейронов случайным образом отбрасывается, чтобы предотвратить переобучение.
  • Мы используем оптимизатор Адама и кросс-энтропию для обучения нашей модели.

Пришло время создать свой собственный CNN!