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

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

КАК РАБОТАЮТ КОВНЕТЫ

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

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

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

Рассмотрим изображение ниже

Набор от X1 до X16 представляет собой матрицу из 16 пикселей, представляющую изображение, набор параметров от W1 до W4 называется ядром или фильтром, он представляет функции, которые мы пытаемся обнаружить в изображении.

Операция свертки вычисляет скалярное произведение ядра с локальной областью изображения, локальная область будет точно такой же размерности, что и ядро. Следовательно, если вы выберете ядро ​​3 x 3 вместо ядра 2 x 2, которое я описал выше, локальная область изображения, которая будет свернута с ядром, также будет 3 x 3 пикселя.

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

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

Обратите внимание на параметр B выше, это смещение, с которым вы уже знакомы в стандартных нейронных сетях. Если вы не до конца понимаете это, я рекомендую прочитать мой первый пост или, если вы хотите запачкать руки более глубокими деталями, Stanford’s CS231 - отличная отправная точка.

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

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

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

Здесь свертка сдвигается на один пиксель за раз

Это представлено как

Эта смена - это шаг в 1

Шаг 2 вполне возможен и иногда используется, они представлены как

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

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

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

Чтобы понять, как это влияет на производительность нейронных сетей, взгляните на картинку ниже:

Вы можете видеть, что это Кристиано Роналду.

Поэтому я решил сгладить это изображение, чтобы получить ширину 56, посмотрите на результат ниже.

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

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

Без лишних слов, я бы сейчас объяснил, как разрабатывать сверточные нейронные сети с использованием keras.

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

import keras
from keras.datasets import mnist
from keras.layers import Dense,Conv2D,Flatten
from keras.models import Sequential
from keras.optimizers import SGD
import keras.backend as K

(train_x, train_y) , (test_x, test_y) = mnist.load_data()

img_rows, img_cols = 28, 28


if K.image_data_format() == "channels_first":
    train_x = train_x.reshape(train_x.shape[0], 1, img_rows, img_cols)
    test_x = test_x.reshape(test_x.shape[0], 1,  img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)

else:
    train_x = train_x.reshape(train_x.shape[0],img_rows, img_cols, 1)
    test_x = test_x.reshape(test_x.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)


print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)


train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)

model = Sequential()
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu",input_shape=input_shape))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Flatten())
model.add(Dense(units=10,activation="softmax"))

model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.fit(train_x, train_y, batch_size=32, epochs=20, validation_data=(test_x, test_y), shuffle=True)

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

Здесь есть несколько новых вещей, и я объясню каждую.

if K.image_data_format() == "channels_first":
    train_x = train_x.reshape(train_x.shape[0], 1, img_rows, img_cols)
    test_x = test_x.reshape(test_x.shape[0], 1,  img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)

else:
    train_x = train_x.reshape(train_x.shape[0],img_rows, img_cols, 1)
    test_x = test_x.reshape(test_x.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

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

model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu",input_shape=input_shape))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Conv2D(filters=128,kernel_size=[3,3],activation="relu"))
model.add(Flatten())
model.add(Dense(units=10,activation="softmax"))

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

Здесь слой Conv2D в keras представляет собой единственный сверточный слой. Фильтры представляют количество каналов или количество детекторов функций, как я объяснил ранее. Затем мы указываем размер ядра, обратите внимание на мои диаграммы, что я использовал размер ядра [2,2], однако на практике ядра [3,3] предпочтительнее, поскольку они лучше отражают структуру и являются эффективными с вычислительной точки зрения. Мы также указываем функцию активации как «relu», я уже объяснял это в своем первом посте.

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

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

Если ваш ноутбук оснащен графическим процессором Nvidia, установите CudNN и версию tensorflow для графического процессора.

Запустить

pip3 install --upgrade tensorflow-gpu

Чтобы установить версию GPU

Если на вашем ноутбуке нет графического процессора Nvidia. Тогда Облако - это то, что вам нужно.

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

Запустите приведенный выше код, вы должны получить точность около 99,10%.

Не стесняйтесь изменять сеть по своему желанию.

Есть еще много компонентов архитектур CNN, которые я хотел бы обсудить в следующих уроках.

На данный момент действительно здорово создать рукописный распознаватель цифр, который может классифицировать цифры с точностью 99%.

Существуют и другие среды для проведения крупномасштабных экспериментов, в их число входят

Microsoft Azure,

Google Cloud Datalab

Amazon Web Services

ЛидерГПУ

и более.

Но ты должен заплатить.

Следующим моим постом будет очень интересная тема в области искусственного интеллекта. Будьте на связи.

Если вам понравился этот пост, хлопните в ладоши и поделитесь им в твиттере.

Вы можете связаться со мной через @johnolafenwa