Итак, вы начали свои шаги в храме всемогущего существования ИИ, преодолели машинное обучение, глубокое обучение и компьютерное зрение и оказались лицом к лицу с боссом последнего уровня… Мутация глубокого обучения и компьютерного зрения! Поначалу это может показаться пугающим, но с правильным оружием, которое я предоставлю вам в этом блоге, вы заставите его дрожать перед вашими пальцами программиста!
Хватит мистики и давайте углубимся в ConvNets.
Очень краткая история CNN
Сверточные нейронные сети (CNN) являются основой того, что мы сейчас считаем эффективным способом классификации изображений (среди многих других приложений).
«Но что вы подразумеваете под «теперь подумайте»? Как мы это делали?
Что ж, у CNN есть история. Честно говоря, у компьютерного зрения, которое привело к CNN, долгая, но медленная история, о которой вы можете прочитать больше в Блоге Мустафы Авни «Введение в компьютерное зрение».
Еще в 1950 году нейрофизиологи Дэвид Хантер и Торстен Визель из Медицинской школы Джона Хопкинса теоретизировали существование двух типов клеток в зрительной коре человека, которые как-то связаны с тем, как мы воспринимаем паттерны:
- Простые ячейки – это ячейки, которые реагируют на края [изображений] произвольной ориентации.
- Сложные ячейки могут работать на том же уровне, что и простые ячейки, но могут работать в любом месте изображения, что делает эту ячейку склонной к пространственной инвариантности.
Пространственная инвариантность – это свойство, согласно которому расположение «объекта интереса» не влияет на процесс, через который проходит наш разум [а также модели, как мы увидим далее], чтобы извлечь определенные черты.
Основная идея здесь заключается в том, что сложные клетки получают помощь от простых клеток за счет суммирования выходных данных нескольких простых ячеек в разных местах в пределах поля зрения. Концепция сложных ячеек, состоящих из суммы простых ячеек, дает этим сложным ячейкам возможность обнаруживать особенности практически в любом месте [т.е. пространственно инвариантны] в пределах поля зрения.
Та же самая концепция пространственной инвариантности и процессы, через которые проходят сложные клетки, становятся важными (теоретически) при работе с CNN.
Вдохновленный чудесными способностями человеческого зрения, Кунихико Фукусима, японский ученый-компьютерщик, приступил к созданию самого раннего представления того, что мы считаем строительными блоками любой CNN, в своей статье под названием Неокогнитрон. Позже это вдохновило многих на создание своих первых многоуровневых сверточных нейронных сетей.
Почему бы просто не использовать многослойную нейронную сеть?
Это действительно очень хороший вопрос. Давайте подробнее рассмотрим многослойную нейронную сеть.
Мы знаем, что работа нейронной сети состоит в том, чтобы извлекать информацию и давать некоторую информацию, используя группу функций и их соответствующие метки. [При работе с неконтролируемыми методами Yi (метки) не существует]
Мы также знаем, что изображения обычно состоят из пикселей с тремя каналами (R, G, B), каждый из которых представляет потенциальную входную функцию для нашей гипотетической плотной нейронной сети (DNN). Значения этих пикселей могут варьироваться от 0 (самый темный) до 255 (самый яркий). [Несмотря на то, что нормализация значений пикселей изображения является обычной практикой]
Примечание. Для представления изображений доступно более 150 цветовых пространств. RGB является одним из них.
Для следующего примера предположим, что мы имеем дело с изображением в градациях серого [28 x 28]. Это дает нам в общей сложности 28 * 28 = 784 пикселя. [Что по сегодняшним стандартам ничтожно, думаю, 8k]
Давайте посмотрим на последствия добавления этого изображения в многослойную нейронную сеть:
- Очень высокая сложность модели: учитывая, что мы имеем дело с изображением в оттенках серого 28 x 28, наш MLNN должен был бы ожидать 28² = 784 входных данных! Это не только увеличивает сложность нашей модели, что вынуждает нас экспоненциально вводить больше данных, чтобы избежать переобучения [Проклятие размерности], но также необоснованно расширяет наше входное измерение сети. просить больше вычислительной мощности.
- Потеря пространственной информации. Для изображений важна пространственная информация. Другими словами, если вы берете пиксель в качестве эталона, окружающие его пиксели имеют первостепенное значение для контекстуализации интересующего пикселя. Однако DNN требуют, чтобы вы сгладили все изображение в вектор размера (784,1), прежде чем подавать его на входной слой, поэтому теряется весь контекст и порядок, в котором изображение изначально появилось. Это делает DNN бесконечно трудным для различать пространственно и даже с определенными объектами, где в изображении находится интересующий объект.
Итак, что такое CNN?
Сверточные нейронные сети (CNN) — это сливки архитектуры, когда речь идет о компьютерном зрении. Они представляют собой подмножество глубоких нейронных сетей, которые демонстрируют важную черту пространственной инвариантности благодаря ядерным сверткам, которые в нашем случае представляют собой простое скалярное произведение между двумя матрицами, когда речь идет о классификации изображений, сегментации изображений, Обнаружение объектов, классификация объектов и многое другое.
Это достигается путем выбора наиболее оптимальных гиперпараметров, некоторые из которых включают в себя:
- Количество фильтров/ядер + размер фильтров/ядер
- Прокладка
- Объединение слоев
- Слои свертки
- Количество полностью связанных скрытых слоев + Количество нейронов в скрытом слое
- Функция активации
- Скорость обучения
- Количество эпох + размер пакета
Почему именно CNN?
Причины, по которым мы используем CNN, на самом деле просты:
- Совместное использование параметров. Совместное использование параметров — это наблюдение, при котором мы можем использовать одно ядро/фильтр с параметрами, состоящими из его весов, для многократной свертки одного и того же изображения, эффективно уменьшая количество параметров, с которыми вам приходится иметь дело. с каждым изображением для каждого ядра. Это связано с тем, что типичный детектор (фильтр), используемый для свертки определенной части изображения, также может быть полезен в других частях изображения.
- Разреженность соединений.Разреженность соединений — это еще одно наблюдение, согласно которому одиночныйпиксель в выходных данных карты объектов, который является продуктом свертки фильтра ядра по матрице исходного изображения, соответствует к набору nxn пикселей в изображении, свернутых с помощью фильтра, что уменьшает число соединений, которые изображения имеют по отношению к выходным данным. [т.е. 1 пиксель карты объектов ~ n x n набор пикселей изображения, свернутых с фильтром размера n]
Некоторые термины, обсуждавшиеся выше, будут подробно рассмотрены в следующих разделах!
Свертки ядра
К настоящему времени мы знаем, что сверточные нейронные сети наиболее известны своей способностью извлекать определенные функции из изображений, где бы эти функции ни находились. В основном это достигается за счет того, что ядра несколько раз «свертывают» изображение по всей сети CNN, создавая то, что мы называем картой объектов.
ПРИМЕЧАНИЕ. Прежде чем мы пойдем дальше, я хотел бы сделать очевидным изменение в терминологии. Я перестану называть ядро просто из-за его устрашающего оттенка. Поэтому в оставшейся части этого блога я буду называть его «фильтр», что также является часто используемым названием ядра.
Этот фильтр представляет собой просто нечетную матрицу размера n x n, содержащую веса. Что делает этот фильтр, так это то, что он привязывается к каждому набору n x n пикселей на изображении и выполняет скалярное произведение с ними, двигаясь слева направо, сверху вниз, заканчивая в правом нижнем углу изображения. Это «свертывание» позволяет фильтру извлекать то, что «он» считает важной характеристикой, определяемой его весами.
Причина, по которой фильтр должен быть нечетного размера, просто связана с тем, что нам нравится представлять и обрабатывать каждый пиксель изображения как исходный пиксель. Другой способ визуализировать исходный пиксель — это просто точка привязки, в которой центрируется фильтр.
Типы фильтров, показанные на рис. 6, уникальны тем, что они были созданы вручную [во времена, когда нейронные сети еще не были популярны], а не изучены сверточной сетью. Эти четыре типа фильтров называются Функциями Хаара, и они до сих пор широко используются в традиционных методах работы с резюме.
Вся свертка на самом деле представляет собой сумму значений скалярного произведения матрицы с любым набором n x n пикселей, на который накладывается фильтр! Да это оно! Ниже показан фильтр 3 x 3 [обратите внимание, как это странно] «свертывается» на одноканальном наборе пикселей 5 x 5.
Просто чтобы удовлетворить ваше любопытство, вот как будет выглядеть выбор фильтра четного размера, чтобы попытаться свернуть изображение:
Как вы можете видеть на рис. 8, абсолютно невозможно представить исходный пиксель (93), не говоря уже о любом другом пикселе, при свертывании изображения для создания карты объектов.
Многоканальные свертки
Теперь, когда концепция свертки изображений с использованием фильтров ясна, вы можете распространить ту же идею на цветные изображения, в результате чего у нас будет 3 канала (R, G, B) для свертки. Следовательно, потребуется фильтр с 3 отдельными каналами, по одному для захвата деталей для каждого канала изображения.
После того, как каждый канал в фильтре свёрнут по соответствующему каналу изображения, мы проходим через промежуточный этап, на котором нам нужно будет сложить результаты свёрток, чтобы получить общий результат.
Наконец, мы добавляем смещение к полученной карте объектов, чтобы завершить процесс свертки.
ПРИМЕЧАНИЕ. Карта признаков, полученная в результате свертки с изображением, НЕ содержит значения, соответствующие изображению. Скорее, это значения, которые могут комфортно превышать 255 и плавать ниже 0. Вместо этого эти карты можно визуализировать с помощью тепловых карт.
Если вы решите использовать более одного типа фильтра для обнаружения более одного типа объектов, то вместо выходного канала 4x4x1 получится канал 4x4x2. >каналы.
Или, скорее, 4x4xN, где N – это количество фильтров, которые вы используете для свертки изображения.
Выходной размер карты объектов демонстрируется приведенным ниже уравнением, состоящим из нескольких гиперпараметров, которые мы вскоре обсудим.
ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ (прочитайте это дважды):
независимо от количества фильтров на сверточный слой, число фильтров каналов в одном фильтрезависит от количества входных каналов объекта/изображения, с которыми он свёртывается. Теперь количество каналов в выходных функциях ЗАВИСИТ от количества фильтров (НЕот количества каналов в одном фильтре). Только фильтр в ПЕРВОМсверточном слое содержит каналы, которые содержат отдельные веса для каналов входного изображения R,G,B. Однако позже в CNN каналы, соответствующие более поздним фильтрам, НЕ являются каналами для различных цветов. В каждом канале есть комбинация RGB и определенная функция, которую нужно искать.
Кратко возвращаясь к теме s-клеток и c-клеток (простых и сложных), вы можете увидеть взаимодействие между сложными и простыми ячейками на протяжении всего Блока 1, ведущее к извлечению пространственных инвариантных функций, которые представляют исходное изображение в Блок 5.
И поэтому, после миллионов лет эволюции, мы пытаемся подражать тому, что природа разработала для нас, поскольку это было опробовано и проверено на работоспособность.
Все это замечательно, но заметили ли вы, как результат свертки ядра над объектом/изображением всегда приводит к другой карте объектов, которая меньше, чем сама исходная карта объектов/изображение?
Это связано с проблемой, которую мы называем Эффект границы!
Пограничный эффект
Эффект границы описывает явление, при котором фильтр n x n не может захватить внешние строки и столбцы изображения просто потому, что часть фильтра выходит за пределы изображения, в котором нет пикселей. Результат - потеря информации.
Красная рамка здесь представляет изображение, которое получилось бы в результате свертки изображения 6x6 с ядром 3x3, если бы мы не позаботились о том, что мы называем эффектом границы. [т. е. потеря информации]. Однако использование метода, называемого дополнением, гарантирует, что мы получим карту объектов размером с входное изображение.
Примечание. Размер отступа может отличаться в зависимости от размера ядра, чтобы предоставить вам карту объектов того же размера, что и входное изображение/функция.
Прокладка
Заполнение — это метод, при котором мы вводим пиксели с нулевым значением или, другими словами, «подушку» вокруг изображения, чтобы помочь учесть все пиксели изображения, что дает нам карту функций, размер которой равен размеру изображения. сам.
Примечание №1: Вы не увеличиваете и не уменьшаете размер самого изображения! Это постоянное значение.
Примечание № 2. Вы можете указать количество строк и столбцов, заполняющих код, с помощью кода.
Другая причина использования заполнения связана с результирующим уменьшением размера карты объектов по всей CNN за счет сверток, что происходит слишком быстро, что лишает нас возможности извлекать нужную нам информацию.
Однако бывают моменты, когда мы хотим уменьшить выборку нашей карты изображений/признаков, и для этого мы вводим объединение.
Объединение
Объединение — это метод, с помощью которого мы можем уменьшать выборку карт объектов, избавляясь от любых пикселей, которые не обязательно представляют функцию, которую мы хотим извлечь, и по-прежнему иметь карту с уменьшенной выборкой, представляющую исходную карту. Он также используется для уменьшения количества параметров и, следовательно, вычислений, необходимых в ConvNet.
Думайте об объединении как о способе размещения пустой сетки n x n в наборе пикселей n x n на изображении/функции в попытке захватить только важные детали.
Примером пикселей, которые мы удалим, могут быть пиксели, принадлежащие фону изображения с собакой. Поскольку CNN не заботится о том, где находится собака на изображении, мы можем использовать это в своих интересах и отбросить все ненужные пиксели.
Среди многих методов объединения есть два, с помощью которых можно применить матрицу размера n x n [нечетное или четное]:
- Max Pooling: возвращает максимальное значение, содержащееся в пуле значений в матрице, наложенной на изображение/функция.
- Средний пул: возвращает среднее значение набора чисел в пуле значений в матрице, наложенной на изображение/функция.
Шаги
Ваш шаг — это то, что определяет, сколько пикселей вы хотите, чтобы ваш фильтр переместился, прежде чем приступить к следующему действию свертки или объединения. По мере увеличения числа шагов, естественно, размер выходной карты признаков уменьшается.
Давайте возьмем пример сверточного слоя, принимающего либо значение шага 1, либо значение шага 2 [то же самое относится и к объединению]:
Примечание. Значение шага 2 (т. е. 2x2) означает «каждый раз перемещаться на 2 пикселя по горизонтали и на 2 пикселя по вертикали». Эта идея распространяется на любое значение шага, которое вы берете.
Функции активации
Функция активации в известной нам плотной нейронной сети — это то, что помогает придать смысл нашему выводу и стабилизировать наши значения, ограничивая или освобождая их в той степени, в которой мы выбираем. Это также имеет эффект нелинеаризации наших входных данных, так что выходные данные не обязательно являются просто линейной комбинацией входных данных, умноженных на веса! Это ничем не отличается от сверточных нейронных сетей.
Примечание. В функциях активации, что более важно, мы также пытаемся убедиться, что сами функции дифференцируемы, поскольку они имеют определенный градиент. [Подумайте о градиентном спуске]
После завершения каждой выполненной операции свертки выходная карта полностью проходит через функцию активации, обычно ReLU, например, для внесения некоторой нелинейности в сеть.
Примечание. Вы также можете ввести линейность, в зависимости от задачи, и в этом случае вы должны использовать функцию активации (или ее отсутствие!), которая сводит все свертки к некоторой линейной комбинации входных данных. .
Полносвязные слои
Все, что мы обсуждали до сих пор, должно было привести нас к точке, где у нас есть краткий набор nxnxf[где f — количество карт объектов]надежные, пространственные инвариантные карты объектов, которые можно преобразовать в одномерный вектор. Весь этот процесс, ведущий к полностью подключенному слою, мы называем извлечением признаков.
Этот одномерный вектор, который считается полностью репрезентативным для исходного входного изображения, затем подается в обычную нейронную сеть с прямой связью на основе классификатора с соответствующей функцией активации и потери, подходящей для создания мультикласса или бинарного класса. классификация.
Вывод
При этом CNN — это красота. Не только из-за присущей ему сложности, но и из-за его способности переопределять множество сложных проблем и обрабатывать многомерные пространства, уменьшая их до чего-то репрезентативного и, что более важно, управляемого.
Предлагаю, дочитав до этого момента, посмотреть на различные архитектуры CNN (некоторые из которых перечислены в этом блоге) и пройтись по ним слой за слоем, чтобы проверить, способны ли вы определить, что происходит! Сначала это может занять некоторое время, но я обещаю, что во второй раз будет лучше!
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь обращаться ко мне в Instagram, LinkedIn или по почте!