Сверточные нейронные сети - это подкатегория нейронных сетей, которые оказались чрезвычайно эффективными в таких сложных задачах, как распознавание и классификация изображений. Первый CNN был построен Янном Ле Канном: LeNet5, но настоящий интерес к CNN возник после успеха ImageNet Алекса Крижевского, который смог снизить ошибку классификации до рекордных 15% с 26%.

Покажите свою поддержку, подписавшись на нашу рассылку!

В этой статье я расскажу вам, как использовать CNN в задаче классификации цифр MNIST.

CNN состоит из четырех скрытых слоев, а именно:

  1. сверточные слои
  2. максимальное количество слоев пула
  3. полносвязные слои
  4. выпадающие слои

Я объясню роль и концепцию каждого уровня по мере прохождения кода.

CNN, которую мы собираемся реализовать сегодня, является моделью, разработанной Алексом Крижевским и также названной в его честь - AlexNet.

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

Набор данных MNIST можно получить с помощью модуля urllib и использования pickle для загрузки файлов в нашу модель. Мы определяем функцию load_dataset ():

Мы можем увидеть данные изображения из нашего набора данных с помощью модуля matplotlib:

plt.imshow(X_train[0][0], cmap=cm.binary)

Мы получаем следующий результат:

Затем мы должны создать структуру нашей нейронной сети, то есть слои, но перед этим мы должны определить некоторые переменные, которые необходимы для функционирования наших слоев:

batch_size относится к количеству обучающих примеров в каждом пакете для нашего пакетного градиентного спуска. output_size установлен на 10, что указывает количество классов, которые мы прогнозируем в выходном слое, то есть 10 цифр в mnist. data_size - это форма или размеры входных данных, т.е. наши данные представлены трехмерным блоком размером 28x28, а поскольку наш набор изображений является черно-белым, устанавливается третье значение или канал RBG. на 1. input_var и output_var являются объектами Tensortype, которые будут содержать входные и выходные данные. Наконец, net - это имя нашей модели, которая представляет собой простой словарь Python.

Это структура нашей нейронной сети: AlexNet:

Слой ввода просто принимает входные данные и их форму в качестве аргументов.

Первый слой - это сверточный слой, который имеет фильтр, то есть двумерную матрицу фиксированного размера F, которая сдвигается по всей входной матрице N с определенным шагом S , на выходе получается размер- (N-F + 2P) / S + 1.

Затем слои объединения уменьшают пространственный размер вывода, заменяя значения в ядре функцией этих значений, то есть этот слой уменьшает размер изображения. Здесь мы будем использовать lasagne.layers.Pool2dLayer(). Слой максимального пула делит матрицу на пулы, создает матрицу еще меньшего размера, содержащую максимальное значение из каждого пула (с использованием того же метода фильтрации, который обсуждался выше).

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

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

  • Что произойдет, если мы установим параметр dropout равным 0?

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

Наконец, наш выходной слой - это слой softmax. В теории вероятностей выходные данные функции softmax могут использоваться для представления категориального распределения, то есть распределения вероятностей по n различным возможным исходам. Поскольку у нас есть 10 классов или 10 рукописных цифр, мы используем слой softmax с десятью нейронами.

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

Чтобы лучше понять различные уровни и аргументы уровней, просмотрите: http://lasagne.readthedocs.io/en/latest/modules/layers.html

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

Как видите, мы использовали метод регуляризации L2, чтобы уменьшить шум в нашей сети. Теперь второй шаг - определить правило обновления. Стохастический градиентный спуск - одна из наиболее широко используемых и эффективных функций обновления веса. Я использовал вариант SGD под названием Adam, который является оптимизированной версией SGD.

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

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

Затем мы просто обучаем модель по нашим обучающим данным, используя мини-пакеты размером 100 (помните? batch_size = 100), и тестируем нашу модель, чтобы отобразить ошибку теста:

Я запустил программу на своем скромном процессоре (позже опубликую результаты на графическом процессоре) и получил следующий результат:

Test Error: 0.01470 Time:4134.223 seconds

Таким образом, на нашем тестовом наборе мы получили точность 98,53%. Модель может применяться к большим наборам данных и к реальным приложениям обработки изображений.

До следующего раза!