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

В этом примере мы будем использовать образец набора цифр MNIST. Этот набор данных содержит 60 000 образцов изображений в качестве обучающего набора и 10 000 образцов изображений в качестве тестового набора рукописных цифр от 0 до 9. Эти черно-белые изображения имеют ширину 28x28 пикселей. Наша цель — разработать нейронную сеть, которая может классифицировать эти изображения от 0 до 9. Мы пройдем упражнение в три итерации и оценим точность сети на каждом шаге.

· Построение глубокой нейронной сети

· Тонкая настройка сети

· Сверточные нейронные сети (CNN)

Мы будем использовать Keras для этого примера. Keras — это высокоуровневый уровень API, написанный на Python, который использует популярные фреймворки, такие как Tensorflow CNTK или Theano, в качестве базовой основы. В этом случае мы будем использовать Keras с Tensorflow.

Построение глубокой нейронной сети

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

Вот ключевые моменты, на которые следует обратить внимание в отношении кода.

· Мы получаем данные MNIST, используя встроенный вызов API keras.datasets.

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

· Это задача мультиклассификации, где результаты могут быть от 0 до 9. В таких случаях принято использовать One Hot Encoding, чтобы вывод по-прежнему считался двоичным. Для каждого из входов в приведенной ниже таблице показаны соответствующие выходные данные.

· Мы используем стохастический градиентный спуск для нашего оптимизатора.

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

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

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

Точная настройка сети

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

· Использование Relu в качестве функции активации вместо Sigmoid — Relu в последнее время является рекомендуемой функцией по сравнению с tanh или Sigmoid. В этой статье немного подробнее об опциях этих функций активации — https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6.

· В качестве оптимизатора использовался Адам вместо стохастического градиентного спуска (SGD). У Адама более низкая стоимость обучения по сравнению с SGD. Подробный анализ и математическое обоснование Адама можно увидеть в статье на https://arxiv.org/abs/1412.6980.

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

Благодаря этим простым изменениям мы видим заметное улучшение производительности нашей сети.

Точность теста подскочила до 97,6%. Это значительное улучшение, но мы все еще можем улучшить производительность этого набора данных.

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

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

Давайте рассмотрим код для этого шага.

Точность этого подхода значительно выше и составляет 99,26%. Это иллюстрирует причину, по которой CNN так популярны для распознавания изображений.

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