Компьютерное зрение стало проще с Keras

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

Использование Keras и искусственных нейронных сетей для распознавания рукописных цифр

вступление

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

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

В широком смысле компьютерное зрение можно рассматривать как способность компьютеров интерпретировать цифровые изображения или видео.

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

Вызов

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

Задача доступна в виде открытого конкурса Kaggle. Итак, если вы новичок в компьютерном зрении, я призываю вас принять участие в конкурсе, создать свою собственную сеть и отправить свой результат. При любом типе машинного обучения чтение, дополненное практикой, в долгосрочной перспективе приведет к мастерству.

Предпосылки

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

Данные

Нам предоставили два файла CSV от MNIST (Современный национальный институт стандартов и технологий), содержащие рукописные цифры в цифровом формате. Цифры (от 0 до 9) представлены одномерным массивом размером 784. По сути, это сглаженное изображение размером 28 на 28 пикселей.

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

Как это обычно бывает с задачами машинного обучения Kaggle, один из файлов — это данные обучения, а другой — данные тестирования. Данные обучения помечены, а данные тестирования — нет. Далее я разделил обучающие данные на обучающий и проверочный наборы, следуя передовым методам машинного обучения.

Подробнее о данных здесь.

Инструменты

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

Что такое нейронные сети?

Я не буду здесь подробно описывать нейронные сети, но дам краткую интуицию.

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

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

Примечание: математическая функция — это просто то, что принимает входные данные, выполняет операцию и возвращает результат.

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

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

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

Подробнее о нейросети архитектура сети здесь.

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

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

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

Архитектура и параметры

Для нашей задачи распознавания цифр я построил две простые архитектуры искусственной нейронной сети. Они имеют следующую архитектуру и параметры:

Слои: один входной слой, который определяется как одномерный массив размером 784. Два скрытых слоя, первый из которых содержит 300 нейронов, а второй — 100 нейронов. Выходной слой из десяти нейронов для предсказания любой из десяти рукописных цифр.

Функции активации. Функциями активации для нейронов скрытого слоя являются ReLU, которые обычно легко обучить. Функция активации выходного слоя — Softmax. Рациональным для этого является то, что у нас есть проблема классификации нескольких классов.

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

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

Сеть 1: последовательная нейронная сеть

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

Построение сети. Keras предоставляет шаблон для последовательной нейронной сети. Очень интуитивно просто добавить оттуда нужные слои. Функция summary() предоставляет вам подробную информацию об архитектуре сети, включая количество весов в каждом слое.

Доступна сводка для предоставления информации об архитектуре сетей. В нашей сети 266 610 параметров (весов).

Компиляция: всего несколько строк кода.

Подгонка: И подгонка тоже…

Результаты: на 30-й эпохе последовательная нейронная сеть имеет точность 99,82% на данных обучения и 97,64% на данных проверки. Это неплохая производительность при минимальной настройке гиперпараметров.

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

Сеть 2: глубокая и широкая нейронная сеть

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

Построение: Keras не предоставляет шаблона для глубокой и широкой сети, поэтому нам приходится создавать его вручную.

Примечание — код для компиляции и подгонки нашей глубокой и широкой сети точно такой же, как и для нашей последовательной сети.

В нашей глубокой и широкой нейронной сети есть дополнительные 8850 параметров по сравнению с нашей последовательной версией.

Результаты. На 30-й эпохе наша глубокая и широкая сеть имеет точность 99,69 % на тренировочном наборе и 97,62 % на проверочном наборе. Это в значительной степени идентично производительности последовательной сети. Как вы думаете, почему это может быть?

Тестовая отправка

Последовательная нейронная сеть показала точность 97,21% на данных тестирования. Это помещает модель в 70% лучших в таблице лидеров Kaggle.

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

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

Спасибо!