Краткое руководство по изучению сверточной нейронной сети

Что такое CNN?

Сверточные нейронные сети, также известные как CNN или ConvNets, являются чрезвычайно популярными формами нейронных сетей. CNN специально разработаны для визуальных задач. Эти задачи также могут находиться в диапазоне между такими простыми, как Обнаружение рукописных символов (набор данных MNIST), и современными задачами классификации изображений, такими как Обнаружение, распознавание, классификация, локализация, и т. д. Это очень важные задачи в Computer Vision (он же Machine Vision). Это можно использовать для изображений, видео и т. д.

Почему CNN?

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

Историческая справка

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

Эксперимент

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

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

Основной вывод этого исследования:

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

V1: первичная зрительная кора — отвечает за обнаружение краев (тип детектора краев).

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

  • V1 — Движение
  • V2 — Стерео
  • V3 — Цвет
  • V3a — разделение текстур
  • V3b — сегментация, группировка
  • V4 — Признание
  • V7 — распознавание лиц
  • МТ — Внимание
  • МСТ — рабочая память/ментальные образы

Между различными слоями Visual Cortex существует хорошая иерархическая структура.

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

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

Как работает сверточная нейронная сеть

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

Обнаружение краев на изображениях

Чтобы лучше понять CNN, мы должны сначала изучить концепцию свертки по отношению к обнаружению границ. Допустим, у нас есть 6 x 6 оттенки серого (наполовину белое и наполовину черное). Мы будем называть это входным изображением или входной матрицей (поскольку изображение — это не что иное, как матрица пикселей), на этом примере мы поймем, как обнаружить горизонтальный край в оттенках серого. изображение.

Как показано на изображении, здесь мы представляем исходное изображение в градациях серого с 0 и 255. Где белый представлен 0, а черный представлен 255. Если мы хотим, мы также можем масштабировать изображение от 0 до 1, просто нормируя изображение.

Итак, теперь возникает вопрос, как нам направить ребро? Чтобы обнаружить изображение внутри изображения, мы будем использовать простую операцию, называемую Сверточный оператор, которая представлена ​​"*".

Здесь у нас есть еще одна матрица, которая представляет собой матрицу 3 x 3, которая также известна как Ядро/Матрица ядра/Фильтр/Маска/Оператор. Итак, как мы видим, ядро ​​имеет некоторые значения, такие как (+1, +2, +1, 0, 0, 0, -1, -2, -1). В обработке изображений это ядро также известно как детектор горизонтальных краев Sobel.

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

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

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

После получения выходной матрицы 4 x 4 мы нормируем минимум и максимум

Поскольку изображения в градациях серого имеют значения только между min = 0 и max = 255, мы должны повторно нормализовать это изображение/матрицу. Здесь мы используем нормализацию с использованием минимального и максимального значений.

Здесь мы заменяем минимальные значения (в данном случае 0) на 0 и максимальные значения (в данном случае 1020) на 255 и создать новое выходное изображение 4 x 4. Здесь мы представляем выходное изображение таким образом, что там, где у нас есть край, мы заменяем его белыми линиями, а там, где края нет, мы получаем темную линию. Выполняя все эти процессы, мы можем обнаружить Горизонтальный край входного изображения.

Как и обнаружение горизонтальных краев Собеля, у нас также есть детектор вертикальных краев Собеля, обнаружение краев Робинсона, обнаружение краев Робертса, обнаружение краев Марра-Хилдрета, обнаружение краев Кирша, обнаружение краев Превитта назвать несколько.

Заполнение

Как мы узнали из слоя свертки, когда мы даем входное изображение/матрицу размером 6 x 6, мы получаем выход размером размер 4 x 4.

Здесь (nxn) — входные данные, (kxk) — свертка и (n-k+1)(n-k+1) является выходом.

Теперь предположим, что у нас есть матрица 6 x 6 (n = 6) и ядро ​​3 x 3 (K = 3), поэтому мы получим результат в виде Матрица 4 x 4.

Но что, если мы не хотим сжимать его и хотим иметь ту же выходную матрицу, что и входная матрица.

Чтобы решить эту проблему, мы применим трюк с вызовом Padding.

Мы можем просто добавить строку в сверху, по одной внизу и по одной слева. и правая сторона матрицы. Это также называется Заполнение на 1. Теперь возникает вопрос, что мы должны поместить в эти ячейки? Мы можем заполнить эти ячейки нулями, этот метод называется Zero Padding.

Здесь мы выполняем заполнение заданной матрицы 6 x 6 и делаем ее входной матрицей 8 x 8. Потому что мы знаем, что если мы хотим получить выходную матрицу 6 x 6, нам придется взять матрицу 8 x 8.

Здесь мы делаем P = 1 и заполняем заполнение нулями (0). Это называется Нулевой отступ.

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

Шаги

Как видно из изображения, ранее мы помещали матрицу ядер 3 x 3 поверх входной матрицы 6 x 6 и выполняли покомпонентное умножение. а затем добавить. Затем мы сдвигаем 1 ячейку. Это называется Шаг на 1. Точно так же мы можем также Сместить 2 ячейки, просто выполнив Шаг = 2 (s = Длина шага). Когда у нас Длина шага равна 2, просто сдвиньте 2 ячейки как по горизонтали, так и по вертикали.

Здесь (n x n) = входная матрица, s = шаг, (k x k) = матрица ядра.

Допустим, n = 6, k = 3 и s = 2, поэтому:

Итак, из входной матрицы 6 x 6 мы получим выходную матрицу 2 x 2 после операции шаг 2 с размером ядра 3 x 3.

Свертка изображений RGB

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

Из приведенного выше изображения ясно видно, как создается RGB.

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

На приведенной выше диаграмме c = 3 (RGB) мы можем ясно видеть операцию свертки в случае трехмерных тензоров.

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

  1. Уровень свертки имеет несколько ядер одинакового размера (размеры могут различаться, но для простоты мы берем одинаковый размер)
  2. Мы должны позаботиться об отступах и шагах
  3. Вход представляет собой трехмерный тензор (n x n x c) с 3 каналами, а на выходе мы получаем матрицу (n x n x m).
  4. "m" зависит от количества ядер.

Операции

Максимальное количество пулов

Концепция объединения исходит из "инварианта местоположения" (идентификация объекта на изображении).

Существует также «Инвариант масштаба» (помогает нам определить, насколько мал или велик объект) и «Инвариант вращения» (помогает нам определить вращение объекта).

В Max Pooling мы сравниваем первые 4 элемента (1, 1, 5, 6) и выбираем среди них максимальное значение (6), и поместите его в выходную матрицу. В приведенном выше примере мы использовали ядро (k) = 2 и шаг (s) = 2. Входная матрица представляет собой матрицу 4 x 4, а выходная — матрицу 2 x 2.

Теперь давайте рассмотрим еще один пример Max Pooling:

В приведенном выше примере мы используем ядро (k) = 2 и шаг (s) = 1. Здесь входная матрица 4 x 4, а выходная матрица 3 x 3.

Увеличение данных

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

Возьмем набор данных D = {xi, yi}, а затем создадим D’ = {xij, yi}

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

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

Изучив все компоненты CNN, давайте посмотрим на высокоуровневый пример Сверточной нейронной сети, чтобы лучше понять концепции:

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

Выпадение

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

Таким образом, на диаграмме ниже мы ясно видим, что используем x1, x2, x3 и x4,это входной слой, а L1 скрыт первым слой и L2 — это второй скрытый слой, и это наш выходной слой.

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

Коэффициент отсева находится в диапазоне от 0 до 1 (0 ≤ p ≤ 1). Допустим, у нас есть коэффициент отсева 0,4, это означает, что в любом слое 40 % нейронов будут неактивны или выпадут на любой заданной итерации. Делая это, мы можем добиться уменьшения сети и, следовательно, предотвратить Переобучение.

Полностью подключенный слой

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

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

Этапы создания простой сверточной нейронной сети

  1. Во-первых, нам нужно передать входные данные в сверточный слой
  2. Затем мы должны выбрать правильные параметры свертки, включая размер фильтра, отступы и шаги. Затем мы выполним свертку поверх входного изображения.
  3. Затем мы применим ReLU поверх него.
  4. Мы также объединяем выходные данные, чтобы уменьшить размер.
  5. Мы можем добавить столько слоев свертки, сколько захотим, а также использовать исключения.
  6. Затем мы сгладим выходные данные и передадим их в полносвязный слой.
  7. Затем выходные данные будут переданы через функцию активации (Sigmoid или Softmax), и мы получим желаемый результат.

На диаграмме ниже показана архитектура модели CNN:

Типы архитектур CNN

Понимание кода сверточной нейронной сети

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

После написания приведенного выше кода мы получим модель CNN ниже:

Затем мы подгоняем/обучаем модель, используя приведенный ниже код:

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

Заключение

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

Спасибо всем за потраченное драгоценное время и удачного обучения 😊

Ссылка

  1. Видео по теме CNN с https://www.appliedaicourse.com/
  2. http://cs231n.github.io/convolutional-networks/
  3. https://www.mathworks.com/solutions/deep-learning/convolutional-neural-network.html
  4. https://www.youtube.com/watch?v=v20-E_2bT2c
  5. https://blog.floydhub.com/building-your-first-convnet/
  6. https://medium.com/@gopalkalpande/biological-inspiration-of-convolutional-neural-network-cnn-9419668898ac
  7. https://en.wikipedia.org/wiki/Grayscale#/media/File:Beyoglu_4671_tricolor.png
  8. http://www.cns.nyu.edu/~david/courses/perception/lecturenotes/what-where/what-where.html
  9. https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5
  10. https://blog.datawow.io/interns-explain-cnn-8a669d053f8b