В этом уроке я расскажу вам (1) что такое сверточная нейронная сеть, (2) как кодировать в PyTorch (скоро).

Это первая часть урока, в которой я объясню интуитивное представление о CNN и о том, почему он так эффективен в задачах компьютерного зрения. Если вас интересует практическая часть, перейдите к части 2 (скоро) этого руководства, где я расскажу, как (1) загрузить предопределенную нейронную сеть и предварительно обученные веса из PyTorch, (2) создать свой собственный нейронную сеть и (3) обучить свою собственную нейронную сеть.

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

Готов, набор, давай громыхать!

Итак, если вы только начинаете узнавать больше о компьютерном зрении и глубоком обучении (я предполагаю, что это основная причина, по которой вы читаете эту страницу), вы, скорее всего, сталкивались с термином Convolutional Neural Network или сокращенно CNN, и вы вероятно, у вас есть некоторое общее представление о том, как это работает, поскольку существует множество информативных руководств по этой теме. Если вам нужны хорошие материалы для чтения о CNN: Link1, Link2, Link3.

Если у нас есть нейронная сеть, как показано на рисунке 1, мы можем объяснить эту модель, разбив эту модель на 4 основные части: (1) входное изображение, (2) сложенные сверточные слои и (3) полностью связанные слои и (4) выходной вектор.

С левой стороны находится входное изображение. В этом примере у нас есть изображение с буквой «A» и размером 32x32 (поскольку это изображение в оттенках серого, то есть только 2 измерения, иначе оно будет иметь размер 32x32x3, если это изображение RGB).

Справа от входного изображения у нас есть несколько слоев сложенных CNN разных размеров, показанных многослойными квадратами. В качестве примера возьмем карты функций C1. Вы можете спросить, почему эта карта объектов C1 имеет 3 измерения и меньший размер по сравнению с исходным изображением. Это результаты работы CNN. Для этого нам нужен слой CNN со следующими параметрами: размер входного объекта = 1, размер выходного объекта = 6, размер ядра (k) = 7, шаг (s) = 1, отступ (p) = 1. Размер входных и выходных объектов — это третье измерение входных данных (в данном случае изображения) и выходных данных (объектов C1). Размер ядра, параметры шага и заполнения отвечают за изменение размера (высоты и веса) вывода.

Определения:

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

Шаг: количество шагов, предпринятых при перемещении ядра/окна свертки по входным данным.

Входное изображение имеет высоту и ширину 32. Применяя формулу, представленную на рисунке 2, выходное изображение будет иметь высоту и ширину (32–7+2(1))/1+1 = 28. Как мы указали, выходное чтобы иметь 6 размеров элементов и собрать все вместе, мы получили выходной размер, равный [28x28x6], что показано на рисунке 1.

Обратите внимание на рис. 1, чтобы перейти от признаков C1 к признакам S2, используется метод подвыборки. В этом примере выбран метод подвыборки max-pooling (есть также среднее-pooling, которые можно использовать для выполнения подвыборки).

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

В нашем примере параметры max-pooling следующие: k=2, s=2, p=0. Опять же, используя уравнение на рисунке 2, мы можем рассчитать выходной размер признаков S1: (28–2+2(0)/2)+1=14.

Двигаясь дальше, чтобы получить C3 из S2, у нас есть еще один слой свертки с настройкой параметров следующим образом: размер ввода = 6, размер вывода = 16, k = 7, s = 1, p = 1. Затем от C3 до S4 max-pooling с параметрами k=2, s=2, p=0.

Как вы могли догадаться, два последних слоя после S4 являются полносвязными слоями. Пример полносвязных слоев показан на рисунке 4. Входной и выходной слои представляют собой многострочные векторы с одним столбцом. В нашем примере входной слой (вектор) имеет размер [(5x5x16)x1], а выходной слой — [10x1]. Обратите внимание, что число (5x5x16) исходит из выходного размера S4, а число 10 в выходном слое — это общее количество классов, которые мы прогнозируем. Это могут быть любые другие числа в зависимости от поставленной задачи. Например, если вы разрабатываете нейронную сеть только для классификации яблок и апельсинов, то выходной слой будет иметь размер [2x1].

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

Функция потерь — это что-то вроде линейки, которая измеряет, насколько хорошо работает ваша нейронная сеть, при условии, что вы знаете правильный ответ на свой вопрос. Например, у вас есть изображение кошки, и если ваша нейронная сеть классифицирует это изображение как кошку, то потеря или результат функции потерь будет низким значением (близким к 0). Напротив, если нейронная сеть классифицирует это изображение как что-то другое, например, собаку, потеря будет большой. Эта большая потеря накажет вашу нейронную сеть, «сообщив» ей, что «она плохо работает».

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

Обратите внимание, что в слоях F5 и F6 есть два магических числа: 120 и 84. Это количество узлов. Возвращаясь к рисунку 4, узел представлен в виде круга в скрытом слое. Таким образом, теперь мы можем сказать, что слой F5 имеет 120 узлов, а слой F6 — 84 узла. Кроме того, каждый узел в F5 связан с каждым узлом в F6 и наоборот, что создает плотную связь между этими двумя слоями. Точно так же каждый узел в F6 связан с каждым узлом в конечном выходе, а также между входом (сплющенным S4) и F5. Просто объединив три слоя с конечным числом узлов, мы создали сложную модель с 30 120 параметрами.

Получив вывод из нашей модели, как мы можем перейти оттуда к меткам? Мы используем идею индексации. Например, когда я настраиваю свою нейронную сеть, мне также нужно будет создать фиксированные метки для обучения моей нейронной сети. Например [панда, кролик, кошка, собака, жираф, слон] с индексом «1» = «панда», «2» = «кролик» и так далее. Итак, если выходные данные моей нейронной сети имеют наибольшее значение для индекса 3, например [0,1, 1,1, 5,3, 2,2, 0,7, 2,3], то мы можем сказать, что она предсказывает метку «кошка ” для данного входного изображения. Обратите внимание, что положение меток всегда должно быть фиксированным.

Чтобы найти наибольшее значение, мы можем выполнить операцию, известную как argmax, которая просто означает выбор индекса наибольшего значения. Однако argmax не является дифференцируемым, и в глубоком обучении и нейронной сети каждый шаг должен быть дифференцируемым, чтобы вычислить градиент (как упоминалось выше, градиент — это то, как нейронная сеть «обучается»). Поэтому, чтобы смягчить эту проблему, мы заменяем argmax на softmax, чтобы преобразовать вывод в распределение вероятностей. Обратите внимание, что на рисунке 8 сумма выходного вектора равна 1.

Давайте рассмотрим это шаг за шагом:

Используя тот же пример, что и раньше, мы разрабатываем нейронную сеть для классификации следующих 6 животных [панда, кролик, кошка, собака, жираф, слон]. Мы даем изображение кошки нашей нейронной сети, и она возвращает вектор из одного столбца из 6 строк. Значение каждого элемента в векторе равно [0,1, 1,1, 5,3, 2,2, 0,7, 2,3] и показано в столбце 2 в таблице 1. Как упоминалось ранее, мы можем использовать argmax, чтобы выбрать наибольшее значение и назвать его днем. но когда мы проектируем нейронную сеть, это требует немного больше усилий.

Чтобы выполнить softmax, мы сначала берем экспоненту каждого элемента в векторе, который показан в столбце 3 в таблице 1. Затем мы берем сумму всех экспоненциальных членов, что дает нам 225,422. Разделив каждый экспоненциальный член на сумму, мы получаем результат softmax. Теперь, чтобы сделать эту идею более конкретной для вас, необработанные выходные данные нейронной сети можно назвать функцией оценки или простой оценкой, которая просто указывает на то, что большее значение является благоприятным. Экспоненциальные члены представляют собой ненормализованные вероятности, а выходные данные softmax представляют собой нормализованные вероятности. Опять же, обратите внимание, что сумма выходных данных равна 1. В этот момент вместо того, чтобы говорить, что метка «кошка» выбрана, потому что она дает наивысший балл, мы можем сказать, что она выбрана, потому что нейронная сеть сообщила, что входное изображение имеет вероятность 88,9% быть кошкой, что является самым высоким показателем среди всех.

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

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

Темы :

Градиент достойный и обратное распространение

Компьютерное зрение и CNN-1

Компьютерное зрение и CNN-2

Не стесняйтесь задавать любые вопросы в разделе комментариев ниже.

Наслаждайтесь и счастливого обучения!