Подписаться на новости
brand brand
logo logo
Сообщество робототехников

Создаем сверточную нейронную сеть (CNN) в Keras

Создаем-сверточную-нейронную-сеть-CNN-в-Keras
Вторник, 30 Октября 2018, в 12:56
ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ

Это руководство поможет очень быстро создать простую сверточную нейронную сеть (CNN). Такие нейросети обычно используются для классификации изображений. Библиотека Keras, написанная на языке Python, позволяет создать CNN без каких-либо сложностей.

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

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

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-1

CNN

В данном руководстве мы будем использовать популярную базу данных MNIST. Она состоит из 70 000 изображений рукописных цифр от 0 до 9. Мы попытаемся идентифицировать их с помощью нейросети.

 

Загрузка базы данных

Базу данных MNIST легко загрузить – она предоставляется в рамках библиотеки Keras. Среди 70 000 изображений датасета 60 000 даются для обучения и 10 000 – для тестирования.

В загруженной базе данных матрицы X_train и X_test будут содержать изображения, а y_train и y_test – цифры, которые эти изображения обозначают.

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-2

 

Разведочный анализ данных

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

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-3

 

По умолчанию размер каждого изображения в базе MNIST – 28 × 28. При использовании реальных баз данных вам может так не повезти. 28 × 28 – это довольно маленький размер, поэтому CNN сможет проверить каждое изображение довольно быстро.

 

 

Предварительная обработка данных

Нам нужно переформатировать исходные параметры базы данных (X_train и X_test) в ту форму, которая требуется для обучения модели. Первое число – это количество изображений (60 000 для X_train и 10 000 для X_test). После этого идет размер каждого изображения (28 × 28). Последнее число – 1, оно обозначает, что изображения черно-белые.

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-4

Нам нужна «горячая кодировка» нашей целевой переменной. Это означает, что для каждой категории вывода будет создан столбец, а каждой категории ввода будет присвоена двоичная переменная. К примеру, мы видим, что первое изображение – это 5. Значит, шестому числу в массиве будет присвоена 1, а остальное пространство будет заполнено 0.

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-5

 

Построение модели

Мы готовы строить свою модель. Вот ее код:

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-6

 

Мы будем использовать модель последовательного типа. Такие модели в Keras строить проще всего. Этот метод позволяет выстраивать модель послойно. Для добавления слоев используем функцию «add()».

Первые 2 слоя – Conv2D. Эти сверточные слои будут работать с входными изображениями, которые рассматриваются как двумерные матрицы.

64 и 32 – это количество узлов в первом и втором слое соответственно. Это количество можно увеличить или уменьшить в зависимости от размера базы данных. В нашем случае отлично подходят 64 и 32, поэтому эти параметры оставляем.

«Kernel size» (размер ядра) – это размер матрицы фильтра для нейросети. Размер ядра 3 означает матрицу фильтров 3 × 3. Вернитесь к вступлению и схеме в начале, чтобы освежить эти знания.

«Activation» – это функция активации для слоя. Функция активации, которую мы будем использовать для первых двух слоев, называется ReLU (Rectified Linear Activation). Она доказанно хорошо работает в нейросетях.

Первый слой принимает входную форму. Это форма каждого входного изображения – 28,28,1, как указывалось ранее. Число 1 здесь обозначает, что изображения черно-белые.

Между сверточными слоями Conv2D и слоем пулинга (Dense) находится слой выравнивания (Flatten). Он служит соединительным узлом между слоями.

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

Подробнее о слоях сверточной нейросети

В нашем выходном слое будет 10 узлов, по одному для каждого вероятного исхода (0-9).

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

 

Компиляция модели

Для компиляции модели используются три параметра: оптимизатор (optimizer), потери (loss) и показатели (metrics).

Оптимизатор контролирует скорость обучения. В качестве оптимизатора мы будем использовать «adam». Скорость обучения определяет, как быстро рассчитываются оптимальные веса для модели. При меньшей скорости веса будут определяться более точно (до определенного предела), но времени при этом будет затрачено больше.

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

Чтобы упростить интерпретацию, мы будем использовать метрику «точность» (accuracy), чтобы увидеть оценку точности при валидации во время обучения модели.

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-7

 

Обучение модели

Для обучения используем функцию «fit()» со следующими параметрами: данные обучения (train_X), целевые данные (train_y), данные валидации и количество эпох.

Для данных валидации мы будем использовать набор тестов, который уже есть в базе данных (X_test и y_test).

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

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-8

После трех эпох при валидации мы получаем показатель точности 97,57%, и для начала это хороший результат. Поздравляем – вы построили сверточную нейросеть!

 

 

Использование модели для предсказаний

Если вы хотите увидеть настоящие предсказания, которые модель делает для тестовых данных, используйте функцию прогнозирования (predict function). Функция прогнозирования даст массив с 10 цифрами. Они обозначают вероятность того, что входное изображение представляет какую-либо цифру от 0 до 9. Цифра с наибольшим значением и будет предсказанием модели. Сумма вероятностей для всего массива равна 1 (поскольку каждое число является вероятностью).

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

Примечание: необязательно работать с тестовыми данными – вы можете ввести в функцию предсказания свои данные.

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-9

 

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

 

Создаем-сверточную-нейронную-сеть-CNN-в-Keras-10

 

Настоящие результаты показывают, что первые четыре изображения действительно содержат цифры 7, 2, 1 и 0 – модель предсказала все верно!

 

Репозиторий проекта на GitHub смотрите здесь.
 

По материалам: Towards Data Science

рейтинг

261

просмотров

0

комментариев

порекомендовать друзьям

комментарии

Нет комментариев

Гость

Дорогие друзья! Помните, что администрация сайта будет удалять:

  • Комментарии с грубой и ненормативной лексикой
  • Прямые или косвенные оскорбления героя поста или читателей
  • Короткие оценочные комментарии ("ужасно", "класс", "отстой")
  • Комментарии, разжигающие национальную и социальную рознь
brand brand