Глубокое обучение: сверточные нейронные сети в Python

Введение и план курса

Здравствуйте и добро пожаловать на курс «Обработка данных: глубокое обучение на языке Python, часть 3. Свёрточные нейронные сети для машинного распознавания образов».

В предыдущих курсах «Глубокое обучение на языке Python, часть 1 и часть 2» мы охватили основы нейронных сетей – прямое распространение сигнала, обратное распространение и градиентный спуск в нейронных сетях, как писать код нейронной сети с использованием собственно языка Python и библиотеки NumPy, а также как писать код с помощью современных библиотек вроде Theano и TensorFlow. Во второй части мы также рассмотрели некоторые методы ускорения обучения и адаптации коэффициента обучения для улучшения окончательного коэффициента классификации.

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

Данный курс будет состоять из следующих лекций:  Как загрузить данные базы SVHN и проверочный тест для трёхслойной глубокой сети?   Свёртка в глубоком обучении. Обзор и примеры,  Напишите свёртку самостоятельно,  Описание сверточной нейронной сети,  LeNet – как сочетать формы данных,  Свёрточная нейронная сеть в Theano,  Свёрточная нейронная сеть в TensorFlow,  Практические советы по обработке изображений,  Свёрточная сеть в TheanoСвёрточная сеть в TensorFlow.

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

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

Поскольку мои курсы имеют практическую направленность и в них предлагается максимальное количество практики по всем рассматриваемым теоретическим вопросам, то и курс мы закончим построением и проверкой свёрточных сетей в Theano и TensorFlow – двух наиболее популярных библиотеках для глубокого обучения на языке Python.

 

Обзор важнейших понятий

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

Итак, первое – операции обучения и прогнозирования. Вы должны знать, что базовые понятия, применяемые во всех задачах обучения с учителем, – это приспособление, или обучение, когда используются некоторые данные X и некоторые метки Y, и прогнозирование – функция, использующая лишь некоторые данные X и создающая прогноз, который мы пытаемся приблизить к соответствующему Y. Если вы желаете узнать больше о базовых понятиях машинного обучения, вам следует обратиться к моему начальному курсу «Линейная регрессия на языке Python», который можно найти по адресу.

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

Мы также знаем, что обучение нейронной сети является простым использованием градиентного спуска – того самого, который мы используем в логистической и линейной регрессии, когда у нас нет решения в аналитической форме:

W\leftarrow W - \eta \bigtriangledown J.

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

С элементарным введением вы можете ознакомиться в курсе «Логистическая регрессия на языке Python», в котором освещается данная тема и который можно найти по адресу.

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

Далее вы должны знать, как функция затрат J выводится из функции правдоподобия и как мы можем не рассчитывать значение J на всём учебном наборе, а использовать пакеты для улучшения времени обучения. Если вы хотите узнать больше о методе обратного распространения ошибки и градиентном спуске, вы можете обратиться к моему первому курсу по глубокому обучению «Глубокое обучение на языке Python, часть 1», который находится по адресу.

Что касается работы с изображениями, то, как вы знаете, изображение в действительности представляет собой двухмерный массив данных, а если изображение цветное – то трёхмерный массив данных с одной дополнительной размерностью для красного, зелёного и синего каналов. Прежде мы преобразовывали такой массив в вектор, являющийся обычной формой входных данных для нейронной сети, так что, например, изображение размером 28х28 превращался в вектор с размерностью 784, а изображение размером 3x32x32 – в вектор размерностью 3 072. В этом курсе для обработки изображений мы будем сохранять размерность первоначальных изображений.

Если вы хотите узнать, как мы таким образом прежде обучали нейронную сеть распознаванию изображений, вы можете обратиться к моему курсу «Практическое глубокое обучение в Theano и TensorFlow», который можно найти по ссылке.

 

Где взять код и данные для этого курса

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

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

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

Имея примеры машинного обучения из репозитария, вам также следует создать соседнюю с cnn_class папку с названием large_files («большие файлы») – если вы, конечно, ещё не сделали этого в течение предыдущего курса. Именно здесь будут находиться нужные нам данные.

Чтобы получить данные по базе MNIST, вам следует перейти по адресу. Скачивание, думаю сложностей не вызовет. На данном этапе мы будем использовать лишь файл train.csv, поскольку в нём находятся уже размеченные данные. При этом будет более чем хорошо, если вы попытаетесь ещё и самостоятельно решить задачу и предоставить решение, используя изученные в этом курсе методы.

Базу уличных указателей номеров домов вы можете найти по адресу. Вам понадобятся файлы 2-го формата (Format 2), так как именно в них находятся уже обрезанные изображения цифр. Обратите внимание, что это двоичные файлы данных MATLAB, так что для их загрузки вам понадобится библиотека SciPy, о которой, уверен, вы уже слышали, если знакомы с библиотекой NumPy.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: