Сверточные нейронные сети кратко

Обновлено: 08.07.2024

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

Немного истории

На вход перцептрона подаются веса w и исходные данные x, а их произведение корректируется смещением b.

В 1960 году Бернард Уидроу и Тед Хофф разработали однослойную нейросеть ADALINE и её улучшенную версию — трёхслойную MADALINE. Это были первые глубокие (для того времени) архитектуры, но в них ещё не использовался метод обратного распространения ошибки.

Затем в развитии машинного обучения начался период застоя, поскольку компьютеры того времени были не пригодны для создания масштабных моделей. В 2006 году Джеффри Хинтон и Руслан Салахутдинов опубликовали статью, в которой показали, как можно эффективно обучать глубокие нейросети. Но даже тогда они пока не приобрели современный вид.

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

Нейросети повсюду

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

Нейросети активно развиваются и уже используются в автономных автомобилях, в задачах распознавания лиц, классификации видео, определения позы или жестов человека. Кстати, именно свёрточные архитектуры научились обыгрывать людей в шахматы и го. Среди других специфичных применений — анализ медицинских изображений, сегментация географических карт, составление текстового описания по фото (Image captioning) и перенос стиля художников на фотографии.

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

Как устроены свёрточные сети

На прошлой лекции мы обсудили идею создания полносвязных линейных слоёв. Предположим, что у нас есть исходное 3D-изображение 32x32x3. Растянем его в один длинный вектор 3072x1 и перемножим с матрицей весов размером, для примера, 10x3072. В итоге нам нужно получить активацию (вывод с оценками классов) — для этого берём каждую из 10 строк матрицы и выполняем скалярное произведение с исходным вектором.

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

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

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

К изображению можно применять множество фильтров и получать на выходе разные карты активации. Так мы сформируем один свёрточный слой. Чтобы создать целую нейросеть, слои чередуются друг за другом, а между ними добавляются функции активации (например, ReLU) и специальные pooling-слои, уменьшающие размер карт признаков.

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

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

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

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

По такому принципу работают современные свёрточные нейросети.

Подводя итоги

Итак, посмотрим на полный набор функций свёрточного слоя:

— число фильтров K;

— их размер F;

— шаг S;

W2 = (W1 − F + 2P) / S + 1

H2 = (H1 − F + 2P) / S + 1

D2 = K

Если мы посмотрим на код фреймворка Caffe, который мы упоминали на прошлой лекции, то увидим примерно те же параметры:

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

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

Для выполнения задания вам понадобится Python > 3.6 и среда Jupyter Notebook или Jupyter Lab.

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

Следующие лекции (список будет дополняться по мере появления материалов):

Превью к статье о свёрточной нейронной сети

Свёрточная нейронная сеть — специальная архитектура искусственных нейронных сетей, предложенная Яном Лекуном и нацеленная на эффективное распознавание образов. Данной архитектуре удаётся гораздо точнее распознавать объекты на изображениях, так как, в отличие от многослойного персептрона, учитывается двухмерная топология изображения. При этом свёрточные сети устойчивы к небольшим смещениям, изменениям масштаба и поворотам объектов на входных изображениях. Во многом, именно поэтому архитектуры, основанные на свёрточных сетях, до сих пор занимают первые места в соревнованиях по распознаванию образов, как, например, ImageNet.

Почему именно свёрточные сети?

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

Так, если требуется работать с цветными изображениями размером 64х64, то для каждого нейрона первого слоя полносвязной сети потребуется 64·64·3 = 12288 параметров, а если сеть должна распознавать изображения 1000х1000, то входных параметров будет уже 3 млн! А помимо входного слоя есть и другие слои, на которых, зачастую, число нейронов превышает количество нейронов на входном слое, из-за чего 3 млн запросто превращаются в триллионы! Такое количество параметров просто невозможно рассчитать быстро ввиду недостаточно больших вычислительных мощностей компьютеров.

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

Что представляют свёрточные нейронные сети

В отличие от сетей прямого распространения, которые работают с данными в виде векторов, свёрточные сети работают с изображениями в виде тензоров. Тензоры — это 3D массивы чисел, или, проще говоря, массивы матриц чисел.

Представление изображений

Изображения в компьютере представляются в виде пикселей, а каждый пиксель – это значения интенсивности соответствующих каналов. При этом интенсивность каждого из каналов описывается целым числом от 0 до 255. Чаще всего используются цветные изображения, которые состоят из RGB пикселей – пикселей, содержащих яркости по трём каналам: красному, зелёному и синему. Различные комбинации этих цветов позволяют создать любой из цветов всего спектра. Именно поэтому вполне логично использовать именно тензоры для представления изображений: каждая матрица тензора отвечает за интенсивность своего канала, а совокупность всех матриц описывает всё изображение.

Эта же цифра в компьютере

Из чего состоят свёрточные сети

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

Так, например, LeNet5 – одна из первых свёрточных сетей, которая победила в ImageNet, состояла из 7 слоёв: слой свёртки, слой пулинга, ещё один слой свёртки ещё один слой пулинга и трёхслойная полносвязная нейронная сеть.

LeNet5

Рассмотрим подробнее каждый из слоёв, формирующий структуру свёрточной сети.

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

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

Для того, чтобы слой мог выделять признаки, в нём имеются так называемые фильтры (или ядра). Ядра — это всего лишь набор тензоров. Эти тензоры имеют один и тот же размер, а их количество определяет глубину выходного 3D массива. При этом глубина самих фильтров совпадает с количеством каналов входного изображения. Так, если на вход свёрточному слою подаётся RGB изображение и требуется карта признаков, состоящая из 32 каналов, то свёрточный слой будет содержать в себе 32 фильтра глубиной 3.

Свёртка

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

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

Затем числа полученных матриц суммируются в единую матрицу — результат применения фильтра.

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

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

Параметры свёрточного слоя

  • Число признаков (filters count, fc) – это количество фильтров, которые есть в слое.
  • Размер фильтров (filter size, fs) – это высота и ширина тензора фильтров. Обычно является нечётным числом, наиболее часто используются фильтры размером 3 или 5.
  • Шаг свёртки (stride, S) – это количество пикселей, на которое перемещается матрица фильтра по входному изображению. Когда шаг равен 1, фильтры перемещаются по одному пикселю за раз. Когда шаг равен 2, тогда фильтры перескакивают на 2 пикселя за раз. Чем больше шаг, тем меньшего размера карты признаков получаются на выходе.
  • Дополнения нулями (padding, P) – количество пикселей, которые добавляются с каждого края изображения. Это позволяет избежать уменьшения изображения на размер фильтра, поскольку фильтр может накладываться лишь в тех местах, в которых под каждым значением фильтра будет значение входного изображения.

Таким образом, входными параметрами свёрточного слоя являются:

  • тензор размером W1xH1xD1;
  • 4 гиперпараметра: fc, fs, S, P;

А выходным параметром слоя является тензор размером W2xH2xD2, где W2 = (W1 - fs + 2P) / S + 1, H2 = (H1 – fs + 2P) / S + 1, D2 = fc.

Подробнее про арифметику свёрточного слоя и применение параметров padding и stride можно почитать здесь: convolution arithmetic tutorial.

Обучаемые параметры в сверточном слое

В свёрточном слое обучаются только фильтры и веса смещения, а потому общее число обучаемых параметров равно fc·(fs·fs·fd+1), то есть число элементов каждого фильтра плюс один параметр смещения умножается на количество самих фильтров. Благодаря тому, что фильтр, который проходится по изображению, не изменяется во время самого прохождения, получается, что число обучаемых параметров во много раз меньше, чем у полносвязной сети.

Примеры некоторых фильтров

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

Слой подвыборки (пулинга)

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

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

Слой активации

Данный слой представляет из себя некоторую функцию, которая применяется к каждому числу входного изображения. Наиболее часто используются такие функции активации, как ReLU, Sigmoid, Tanh, LeakyReLU. Обычно активационный слой ставится сразу после слоя свёртки, из-за чего некоторые библиотеки даже встраивают ReLU функцию прямо в свёрточный слой. Подробнее про функции активации можно почитать здесь: функции активации.

Функции активации

Полносвязный слой

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

Полносвязный слой

Построение сети

Архитектура сети VGG19

Обучение свёрточной сети

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

Резюме

В данной статье мы познакомились со свёрточными сетями и рассмотрели основные используемые слои. Для большего удобства мы собрали всё самое главное в табличку:

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

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

Общее использование для CNN

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

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

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

Интересное использование для CNN, кроме обработки изображений

Есть исследователи, такие как профессор Джеральд Куон вЛаборатория квититативной биологиииспользование CNN для генеративных моделей в одноклеточной геномике для идентификации заболевания.

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

Волновая сеть Deepmindмодель CNN для генерации синтезированного голоса, используемая в качестве основы для синтезатора голоса Google Assistant.

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

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

В компьютерном зрении ввод часто представляет собой 3-канальное изображение RGB. Для простоты, если мы возьмем изображение в градациях серого с одним каналом (двумерная матрица) и сверточным ядром 3x3 (двумерная матрица). Ядро перемещается по входной матрице чисел, перемещаясь горизонтально столбец за столбцом, скользя / сканируя первые строки в матрице, содержащей значения пикселей изображения. Затем ядро ​​движется вертикально вниз к последующим рядам. Обратите внимание, что фильтр может проходить по одному или нескольким пикселям за раз, это подробно описано ниже.

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

Ниже приведена схема, показывающая работу сверточного ядра.


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


Для обработки краевых пикселей существует несколько подходов:

  • Потеря краевых пикселей
  • Заполнение с нулевым значением пикселей
  • Отражение

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

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

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

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


Большая часть обработки изображений должна работать с изображениями RGB с тремя каналами. RGB-изображение - это трехмерный массив чисел, иначе известный как тензор ранга три.

При обработке трехканального изображения RGB обычно используется сверточное ядро, представляющее собой трехмерный массив чисел с тензором ранга 3. Очень часто сверточное ядро ​​имеет размер 3х3х3, причем сверточное ядро ​​напоминает куб.

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

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

Фильтр перемещается по входным данным таким же образом, скользя или шагая по строкам, затем перемещаясь вниз по столбцам и шагая по строкам, пока не достигнет нижнего правого угла:


С отступом и шагом один выходной сигнал от ввода ширины x, высоты y и глубины 3 будет иметь ширину x, высоту y и глубину 1, поскольку куб выдает по одному суммированному выходному значению для каждого шага. Например, при входном сигнале 3x64x64 (скажем, трехканальном изображении RGB 64x64) одно ядро, делающее шаги по одному с отступом краевых пикселей, выведет карту каналов / объектов 64x64 (один канал).

Стоит отметить, что ввод часто нормализуется, это подробно описано ниже.

Обычно используется свертка второго шага, а не свертка одного шага, когда сверточное ядро ​​движется более чем на 2 пикселя за раз, например, наше ядро ​​3х3 будет начинаться с позиции (1,1), а затем достигать (1,3 ), затем до 1, 5) и т. д., вдвое уменьшив размер выходного канала / карты объектов по сравнению с сверточным ядром, сделавшим шаг в единицу.

С отступом выходной сигнал от входов ширины w, высоты h и глубины 3 будет потолком ширины w / 2, высоты h / 2 и глубины 1, поскольку ядро ​​выводит один суммированный вывод из каждого шага.

Например, при входном сигнале 3x64x64 (скажем, трехканальном изображении RGB 64x64) одно ядро, делающее два шага с отступом краевых пикселей, будет создавать карту каналов / объектов 32x32.

В моделях CNN часто имеется более трех сверточных ядер, 16 ядер или даже 64 ядра в сверточном слое являются общими.

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

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

Пример нескольких сверточных слоев шага 2

С квадратным входом 64 пикселя с тремя каналами и 16 ядрами 3x3x3 наш сверточный слой будет иметь:

вход: 64x64x3
Сверточные ядра: 16x3x3x3 (четырехмерный тензор)
Вывод / активация сверточных ядер: 16x32x32 (16 каналов / функциональные карты 32x32)

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

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

вход: 16x32x32
Сверточные ядра: 64x3x3x3
Вывод / активация сверточных ядер: 64x16x16 (64 канала / функциональные карты 16x16)

Затем после применения ReLU и пакетной нормализации (см. Ниже) применяется другая свертка шага 2:

вход: 64x16x16
Сверточные ядра: 128x3x3x3
Вывод / активация сверточных ядер: 128x8x8 (128 каналов / функциональные карты 8x8).

Если, например, изображение принадлежит к одной из 42 категорий и цель сети состоит в том, чтобы предсказать, к какой категории принадлежит изображение.

Следуя вышеприведенному примеру с выходом 128x8x8, сначала берется средний пул тензора ранга 3. Средний пул - это среднее значение каждого канала, в этом примере каждая матрица 8x8 усредняется в одно число со 128 каналами / картами характеристик. Это создает 128 чисел, вектор размером 1x128.

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

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

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

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

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

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

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

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

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

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

Известная архитектура CNN, которая исключительно хорошо справляется с различными задачами обработки изображений, - это модели VGG (К. Симонян и А. Циссерман), модели ResNet (Кайминг Хе и др.) И модели Google Inception (Кристиан Сегеди и др.). Эти модели имеют миллионы обучаемых параметров.


Теорема об универсальной аппроксимации

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

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

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

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

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

Повестка дня в этой области состоит в том, чтобы дать возможность машинам видеть мир так, как это делают люди, воспринимать его схожим образом и даже использовать знания для множества задач, таких как Распознавание Изображений и Видео, Анализ и Классификация Изображений, Восстановление Медиа, Системы Рекомендаций, Обработка Естественного языка и т.д. Достижения в области Computer Vision и Deep Learning были разрабатывались и совершенствовались с течением времени, главным образом благодаря совершенно конкретному алгоритму — Сверточной нейронной сети (Convolutional Neural Network).

Введение


CNN-последовательность для классификации рукописных цифр

Сверточная нейронная сеть (Convolutional Neural Network — ConvNet/CNN) — это Deep Learning-алгоритм, который может принимать входное изображение, присваивать важность (усваиваемые веса и смещения) различным областям/объектам в изображении и может отличать одно от другого. Предварительной обработки в ConvNet требуется значительно меньше по сравнению с другими алгоритмами классификации. В то время как в примитивных методах фильтры сконструированы вручную, ConvNets при достаточном обучении способны изучать эти фильтры/характеристики.

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

ConvNets или Feed-Forward Neural Nets (FF, FFNN — Нейронные сети прямого распространения)?


Сглаживание матрицы изображения 3х3 по вектору 9х1

На изображении не что иное, как матрица пиксельных значений, верно? Так почему бы просто не сгладить изображение (например, матрицу изображения 3x3 по вектору 9x1) и передать его в многослойный персептрон для классификации? Ну… Все не так просто.

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

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


RGB-картинка 4x4x3

На рисунке у нас есть RGB-изображение, разделенное по трем цветовым плоскостям — красной, зеленой и синей. Существует несколько таких цветовых пространств, в которых существуют изображения: Grayscale (оттенки серого), RGB, HSV, CMYK и т.д.

Можете представить, что станет с вычислительными ресурсами, когда изображения достигнут размеров, скажем, 8K (7680 × 4320). ConvNet нужен, чтобы преобразовать изображения в ту форму, которую легче обрабатывать без потери характеристик, которые имеют решающую роль для получения хорошего прогноза. Это важно, когда мы хотим разработать архитектуру, которая будет не просто хороша в обучении, но еще и масштабируема для массивных наборов данных.

Сверточный слой — Кернел (the kernel)

Свертывание изображения 5x5x1 с кернелом размерностью 3x3x1 для получения свернутой функции 3x3x1

Размеры изображения = 5 (высота) x 5 (ширина) x 1 (количество каналов, например, RGB)
На гифке выше видно, что зеленая часть напоминает наше входное изображение 5x5x1, I. Элемент, участвующий в выполнении операции свертки в первой части сверточного слоя, называется кернелом/фильтром, K, показан желтым цветом. Мы выбрали K в качестве матрицы 3x3x1.

Кернел смещается 9 раз, так как длина страйда (Stride) = 1, каждый раз выполняя операцию умножения матриц между K и частью P изображения, над которым кернел ​​зависает.


Передвижение кернела

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

Операция свертки на матрице изображения MxNx3 с кернелом размерностью 3x3x3

В случае, когда у изображения несколько каналов (например, RGB), кернел ​​имеет ту же глубину, что и входное изображение. Матричное умножение выполняется между стэками Kn и In ([K1, I1]; [K2, I2]; [K3, I3]), и все результаты суммируются со смещением, чтобы выдать нам сжатый выходной сигнал одной глубины.

Операция свертки с длиной страйда = 2

Цель операции свертки — извлечь из входного изображения высокоуровневые признаки, например, линии, края. ConvNets вовсе не обязательно должны быть ограничены только одним сверточным слоем. Традиционно, первый ConvLayer отвечает за захват низкоуровневых признаков, таких как края, цвет, градиентная ориентация и т.д. Благодаря добавленным слоям архитектура адаптируется также к высокоуровневым признакам, выдавая нам сеть, которая имеет столь же здравое понимание изображений в наборе данных, что и мы.

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

Same-паддинг: изображение 5x5x1 дополняется (is padded) нулями, чтобы создать изображение 6x6x1

Когда мы преобразуем изображение 5x5x1 в изображение 6x6x1, а затем применяем к нему кернел размерностью ​​3x3x1, мы обнаруживаем, что размер свернутой матрицы — 5x5x1. Отсюда и название — Same-паддинг.

В то же время если мы выполним ту же операцию без паддинга, мы получим матрицу, которая имеет размеры самого кернела (3x3x1) — Valid-паддинг.

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

Пулинговый слой (Pooling Layer)

3x3 преобразуется с помощью пулинга в сложную функцию 5x5

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

Существует два типа пулинга: максимальный (Max Pooling) и средний (Average Pooling). Максимальный пулинг возвращает максимальное значение из части изображения, покрываемой кернелом. А Средний пулинг возвращает среднее всех значений из части изображения, покрываемой кернелом.

Максимальный пулинг также выступает в роли шумоподавителя (Noise Suppressant). Он полностью исключает шумовые сигналы, а также совмещает подавление шума с уменьшением размерности. Средний же пулинг просто использует уменьшение размерности как способ подавления шума. То есть можно сказать, что Max Pooling работает намного лучше, чем Average Pooling.


Типы пулинга

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

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

Классификация — Полностью Связанный Слой (Fully Connected Layer, FC Layer)


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

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

Существуют множество архитектур доступных CNN, которые сыграли ключевую роль в построении алгоритмов, которые обеспечивают сейчас и будут обеспечивать работу Искусственного интеллекта как такового в ближайщем будущем. Некоторые из них перечисляю ниже:

Читайте также: