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

Разделить набор данных

В этом проекте я создаю новый набор данных, содержащий три подмножества: обучающий набор с 200 образцами каждого класса, проверочный набор со 100 образцами каждого класса и, наконец, тестовый набор со 100 образцами каждого класса.

Построить нейронную сеть

Что касается моей CNN, я использую сверточную базу сети VGG19 с весами, предварительно обученными на ImgaeNet. В базовой модели форма последнего слоя (образцы 4, 4, 512). В дополнение к этому я сначала добавляю плоский слой, который придает форму (пример, 8192). Затем я передаю функции плотно связанному слою. Выпадающий слой после этого предназначен для регуляризации. И последнее, но не менее важное: это еще один плотно связанный классификатор с активацией «softmax» для принятия решения о классификации.

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

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

Чтобы быть загруженными в нашу нейронную сеть, изображения должны быть отформатированы в соответствующим образом предварительно обработанные тензоры с плавающей запятой. Я использую пакет обработки изображений keras, в частности класс ImageDataGenerator, для автоматической обработки данных изображения в тензорные пакеты.

Увеличение данных

Поскольку обучающая выборка невелика, переобучение будет серьезной проблемой. Здесь я использую увеличение данных, чтобы создать больше обучающих данных из существующих выборок обучающих данных. Аргументы, которые я добавляю в свой экземпляр ImageDataGenerator, — это rescale, shear_range, zoom_range и horizontal_flip. Сделав это, моя модель никогда не увидит одну и ту же картинку дважды, что предотвратит проблему переобучения.

  • shear_range : применять сдвиговые преобразования случайным образом
  • zoom_range : случайным образом применять масштабирование внутри изображений
  • horizontal_flip : перевернуть половину изображений по горизонтали

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

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

График точности результатов

В конце концов, я могу достичь точности 95% для набора данных для обучения и около 75 для набора данных для проверки, что меня удовлетворяет. Несмотря на то, что я увеличивал и удалял данные, по-прежнему существует схема переобучения. Причиной этого может быть небольшой размер моего набора данных. В будущем, помимо использования предварительно обученной модели, я также могу попробовать настроить некоторые слои моей нейронной сети.

Надеюсь, вам понравится читать мой мини-проект №1! Код можно найти на github.