Интуитивно понятное руководство по сверточным нейронным сетям

1656631460 intuitivno ponyatnoe rukovodstvo po svertochnym nejronnym setyam

Дафна Корнелисс

SP2HrGs41jlfFPbw0kreBCuNmIX0nulGx-2E
Фото Даниэля Ялмарссона на Unsplash

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

Мозг

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

hgekwBdT-gVJSBlOMHnXIkfXmBBha3sS7Ui3
Источник: https://www.youtube.com/watch?v=40riCqvRoMs

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

Qm6Wu-GLxjcnF6QtOSC9PdYrhuwdoRT0vwtl
Источник: https://www.youtube.com/watch?v=40riCqvRoMs

Это то, что мы подсознательно делаем целый день. Мы видим, маркируем, делаем прогнозы и распознаем шаблоны. Но как это сделать? Как мы можем интерпретировать все, что видим?

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

8ColleqWT2-WZC5EFh-GVf0xIZ2n9ymoIDnN
Визуальный путь. — Источник: https://commons.wikimedia.org/wiki/File:Human_visual_pathway.svg

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

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

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

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

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

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

Компьютеры «видят» иначе, чем мы. Их мир состоит только из чисел. Каждое изображение можно представить в виде двумерных массивов чисел, известных как пиксели.

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

Mrv6CksJK-Aykq6Avbuo0VBpDHSuJAEJDpw9
Как компьютер видит изображение. — источник: http://cs231n.github.io/classification/

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

Сверточные нейронные сети вдохновляются мозгом. Исследования мозга млекопитающих в 1950-х и 1960-х годах Д. Хьюбелом и Т. Н. Визелем предложили новую модель того, как млекопитающие воспринимают мир визуально. Они показали, что зрительная кора кошек и обезьян включает нейроны, реагирующие исключительно на нейроны в их непосредственном окружении.

В своей статье они описали два основных типа клеток зрительных нейронов в мозге, каждая из которых действует по-разному: простые клетки (S клетки) и сложные клетки (С клетки).

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

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

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

pi9p2FN5bGaApL2KSKgkD8g1CSv9FMrgbqAd
Рецептивное поле нейрона. — Источник: http://neuroclusterbrain.com/neuron_model.html

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

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

Позже, в 1998 году, сверточные нейронные сети были представлены в статье Бенгио, Ле Куна, Ботта и Хаффнера. Их первая свертка нейронной сети называлась Ленет-5 и мог классифицировать цифры из чисел, написанных от руки.

Всю историю сверточных нейронных сетей вы можете посмотреть здесь.

Архитектура

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

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

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

Dgy6hBvOvAWofkrDM8BclOU3E3C2hqb25qBb
Обычный NN против CNN. — Источник: http://cs231n.github.io/convolutional-networks/

CNN состоит из двух компонентов:

  • Часть скрытых слоев/извлечение функций

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

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

# before we start building we import the libraries
import numpy as np
from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Densefrom keras.models import Sequential
dobVrh3SGyqQraM2ogi-P3VK2K-LFsBm7RLO
Архитектура CNN. — Источник: https://www.mathworks.com/videos/introduction-to-deep-learning-what-are-convolutional-neural-networks—1489512765771.html

Свертка является одним из основных строительных блоков CNN. Термин свертка относится к математической комбинации двух функций для создания третьей функции. Он объединяет два набора информации.

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

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

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

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

Htskzls1pGp98-X2mHmVy9tCj0cYXkiCrQ4t
Слева: фильтр скользит над входом. Справа: результат суммируется и прилагается к карте функций. — Источник: https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2

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

Gjxh-aApWTzIRI1UNmGnNLrk8OKsQaf2tlDu
Фильтр скользит по входным данным и выводит на новый слой. — Источник: https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2

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

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

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

На анимации ниже показан размер шага 1 в действии.

d0ufdQE7LHA43cdSrVefw2I9DFceYMixqoZJ

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

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

После слоя свертки обычно добавляют a слой объединения между слоями CNN Функция объединения состоит в постоянном уменьшении размерности для уменьшения количества параметров и вычислений в сети. Это сокращает время тренировок и контролирует переоборудование.

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

96HH3r99NwOK818EB9ZdEbVY3zOBOYJE-I8Q
Максимальное объединение принимает наибольшее значение. — Источник: http://cs231n.github.io/convolutional-networks/

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

  • размер ядра
  • количество фильтров (т.е. сколько фильтров мы хотим использовать)
  • шаг (насколько велики шаги фильтра)
  • обивка
# Images fed into this model are 512 x 512 pixels with 3 channels
img_shape = (28,28,1)
# Set up the model
model = Sequential()
# Add convolutional layer with 3, 3 by 3 filters and a stride size of 1# Set padding so that input size equals output size
model.add(Conv2D(6,2,input_shape=img_shape))
# Add relu activation to the layer 
model.add(Activation('relu'))
#Pooling
model.add(MaxPool2D(2))

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

gb08-2i83P5wPzs3SL-vosNb6Iur5kb5ZH43
Как работает свертка с K = 2 фильтрами, каждый с пространственным экстентом F = 3, шагом, S = 2 и заполнением входных данных P = 1. Источник: http://cs231n.github.io/convolutional-networks/

Классификация

После слоев свертки и объединения, наша часть классификации состоит из нескольких полностью связанных слоев. Однако эти полностью подключенные слои могут принимать только одномерные данные. Чтобы превратить наши 3D-данные в 1D, мы используем функцию flatten в Python. Это, по сути, упорядочивает наш 3D-объем в 1D-вектор.

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

#Fully connected layers
# Use Flatten to convert 3D data to 1Dmodel.add(Flatten())
# Add dense layer with 10 neuronsmodel.add(Dense(10))
# we use the softmax activation function for our last layermodel.add(Activation('softmax'))
# give an overview of our model
model.summary
_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================conv2d_1 (Conv2D)            (None, 27, 27, 6)         30        _________________________________________________________________activation_1 (Activation)    (None, 27, 27, 6)         0         _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 13, 13, 6)         0         _________________________________________________________________flatten_1 (Flatten)          (None, 1014)              0         _________________________________________________________________dense_1 (Dense)              (None, 10)                10150     _________________________________________________________________activation_2 (Activation)    (None, 10)                0         =================================================================Total params: 10,180Trainable params: 10,180Non-trainable params: 0__________________________________________________________________

Обучение

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

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

"""Before the training process, we have to put together a learning process in a particular form. It consists of 3 elements: an optimiser, a loss function and a metric."""
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=['acc'])
# dataset with handwritten digits to train the model onfrom keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = np.expand_dims(x_train,-1)
x_test = np.expand_dims(x_test,-1)
# Train the model, iterating on the data in batches of 32 samples# for 10 epochs
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test,y_test)
# Training...
Train on 60000 samples, validate on 10000 samplesEpoch 1/1060000/60000 [==============================] - 10s 175us/step - loss: 4.0330 - acc: 0.7424 - val_loss: 3.5352 - val_acc: 0.7746Epoch 2/1060000/60000 [==============================] - 10s 169us/step - loss: 3.5208 - acc: 0.7746 - val_loss: 3.4403 - val_acc: 0.7794Epoch 3/1060000/60000 [==============================] - 11s 176us/step - loss: 2.4443 - acc: 0.8372 - val_loss: 1.9846 - val_acc: 0.8645Epoch 4/1060000/60000 [==============================] - 10s 173us/step - loss: 1.8943 - acc: 0.8691 - val_loss: 1.8478 - val_acc: 0.8713Epoch 5/1060000/60000 [==============================] - 10s 174us/step - loss: 1.7726 - acc: 0.8735 - val_loss: 1.7595 - val_acc: 0.8718Epoch 6/1060000/60000 [==============================] - 10s 174us/step - loss: 1.6943 - acc: 0.8765 - val_loss: 1.7150 - val_acc: 0.8745Epoch 7/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6765 - acc: 0.8777 - val_loss: 1.7268 - val_acc: 0.8688Epoch 8/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6676 - acc: 0.8799 - val_loss: 1.7110 - val_acc: 0.8749Epoch 9/1060000/60000 [==============================] - 10s 172us/step - loss: 1.4759 - acc: 0.8888 - val_loss: 0.1346 - val_acc: 0.9597Epoch 10/1060000/60000 [==============================] - 11s 177us/step - loss: 0.1026 - acc: 0.9681 - val_loss: 0.1144 - val_acc: 0.9693

Резюме

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

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

Tt7D3r-a6nllpazQndXk2GibSjW2X6NOarO6
— Источник: https://arxiv.org/pdf/1506.01497v3.pdf

Вы можете найти весь код здесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *