# Использование сверточной нейронной сети (CNN) - Керас

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

В этой серии статей «Keras Dogs vs.Cats Challenge» я постараюсь дать вам общее представление о решении любой проблемы классификации изображений. мы решим проблему «Собаки против кошек» с помощью:

Весь код будет размещен в репозитории Github.

Введение

В этой статье мы будем решать знаменитую задачу Kaggle Собаки против кошек с использованием сверточной нейронной сети (CNN). Мы будем использовать Keras Framework. Keras - это библиотека нейронной сети с открытым исходным кодом, написанная на Python. Он может работать поверх TensorFlow, Microsoft Cognitive Toolkit или Theano. Для тех, кто хочет узнать больше о Керасе, я нахожу эту замечательную статью из Химанг Шаратун.

В этой статье мы подробно обсудим:

  • Почему CNN для компьютерного зрения?
  • Подготовка и предварительная обработка набора данных
  • Реализация модели сверточной нейронной сети (CNN) с использованием Keras
  • Обучение модели CNN с использованием данных обучения
  • Тестирование обученной модели
  • Ключевые выводы и выводы

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

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

Почему CNN для компьютерного зрения?

Для приведенной выше сети предположим, что входная форма изображения (64, 64, 3), а второй слой имеет 1000 нейронов. Тогда размер весов, соответствующих слою 1, будет W [1] = (1000, 64 * 64 * 3) = (1000, 12288). Это дает количество параметров для уровня 1, равное 12288000 (~ 10 миллионов).

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

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

С помощью сверточных операций CNN могут изучать низкоуровневые особенности (например, края) в начальных слоях, затем несколько высокоуровневые особенности (такие как ориентация носа, ушей и т. Д.) В более глубоких слоях, а затем, наконец, все лицо. кошки или собаки в последних слоях.

CNN могут добиться этого с помощью:

  • относительно небольшое количество параметров (предотвращает переоснащение модели, а также помогает в требованиях к вычислениям).
  • Совместное использование параметров: детектор функций (например, детектор вертикального края), который полезен в одной части изображения, вероятно, будет полезен в другой части изображения.
  • Редкость соединения: на каждом уровне каждое выходное значение зависит только от небольшого количества входов.

Вышеупомянутые идеи взяты из курса Deep Learning Specialization доктора Эндрю Нг на Coursera. Я настоятельно рекомендую вам пройти этот курс, если вы увлечены глубоким обучением.

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

Набор данных для этой задачи можно найти здесь. Учебный архив содержит 25 000 изображений собак и кошек, а архив тестирования - 12 500 изображений собак и кошек. Распакуйте папку в корневой каталог.

Сначала мы импортируем некоторые библиотеки.

Далее мы определяем некоторые глобальные переменные:

Теперь давайте определим две переменные train_images и test_images, которые хранят информацию о пути всех изображений из корневого каталога в TRAIN_DIR и TEST_DIR соответственно.

Чтобы быть конкретным, train_images и test_images выглядят примерно так:

train_images = [‘./train/dog.2677.jpg’, ‘./train/cat.7657.jpg’,…]

test_images = [‘./test1/4391.jpg’, ‘./test1/1769.jpg’,…]

Мы определяем функцию «read_image (file_path)», которая считывает изображение по заданному пути к файлу с помощью OpenCV (cv2).

Затем мы определяем функцию «Prep_data (images)», которая берет список всех путей изображения (train_images, test_images) и подготавливает данные в формате, необходимом для метода сверточной нейронной сети (CNN). Мы обсудим формат данных позже в статье.

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

Вы должны увидеть такой результат.

Если да, то поздравляем! Вы успешно подготовили набор данных для обучения модели сверточной нейронной сети (CNN). Если нет, прокомментируйте свой запрос ниже, я буду рад помочь.

Давайте проанализируем подготовленные нами данные о поездах и тестах.

Теперь давайте перемешаем данные.

X, y = shuffle(X, y)

Теперь давайте определим классы для кошек как 0 и собак как 1.

classes = {0: 'cats',
           1: 'dogs'}

Давайте разделим набор данных на поезд (80%) и набор проверки (20%).

Теперь мы конвертируем метки проверки и проверки в однозначное векторное представление.

Давайте визуализируем наш набор данных.

Мы определяем функцию «show_images (X, y, idx)», которая принимает аргумент как X_train, y_train и индекс изображения, которое вы хотите видеть соответственно, и показывать вам изображение, используя библиотеку matplotlib.pyplot.

Теперь давайте посмотрим на образец изображения. Вы можете изменить значение третьего параметра (idx) здесь, чтобы увидеть разные изображения наших обучающих данных.

show_images(X_train, y_train, 0)

Осталось еще кое-что нормализовать наш набор для обучения и проверки.

X_train_norm = X_train / 255
X_val_norm = X_val / 255

Реализация модели сверточной нейронной сети (CNN) с использованием Keras

Реализовать глубокую сверточную нейронную сеть (CNN) с использованием Keras очень просто и весело. Мы определяем модель как экземпляр Sequential (), а затем просто определяем слои (Conv2D, MaxPooling2D, Dropout, Dense, Sigmoid). Архитектура нашей модели имеет 4 сверточных слоя, за которыми следует 1 полностью связанный слой, за которым следует сигмоидальный выход.

Используемая функция потерь - categoryorical_crossentropy

Используемый оптимизатор - Адам

Краткое изложение архитектуры нашей модели Deep CNN:

Обучение CNN с использованием обучающих данных

Давайте обучим нашу модель на наших обучающих данных и проверим прогресс нашей модели на проверочных данных.

Мы определяем эпохи (сколько раз мы будем сканировать все наши обучающие данные) равными 50. Размер пакета выбран равным 64.

model9.fit(X_train_norm, y_train_one_hot, validation_data=(X_val_norm, y_val_one_hot), epochs=50, batch_size = 64)

Потеря обучения, точность обучения, потеря проверки, точность проверки после каждой эпохи:

Наша точность обучения составляет 93,53%, а точность проверки - 90,98%, что очень хорошо.

Поздравляю! вы успешно обучили свою модель сверточной нейронной сети (CNN) классификации изображения как кошки или собаки. Если нет, прокомментируйте свой запрос ниже, я буду рад помочь.

Если в вашей системе нет графического процессора, я настоятельно рекомендую вам обучить вашу модель в Google Colab. Код в ссылке GitHub также написан на Google Colab.

Google Colab - бесплатный облачный сервис Google для разработчиков ИИ. С Colab вы можете разрабатывать приложения для глубокого обучения на графическом процессоре бесплатно. Это дает вам бесплатный доступ к Nvidia Tesla K80 GPU и 12 ГБ ОЗУ. Я сам тренировал свои модели на Google Colab, и тренироваться на нем намного быстрее и проще. Более того, он почти похож на блокнот jupyter. Для получения дополнительной информации см. Эту замечательную статью fuat.

Тестирование обученной модели

Давайте сделаем несколько прогнозов и посмотрим, как работает наша Модель.

Теперь давайте проведем небольшое тестирование тестовых данных, которых наша модель никогда раньше не видела.

Здесь я пишу вспомогательную функцию для определения прогноза нашей модели.

Сделаем несколько прогнозов.

Yipeee! Наша модель дает неплохие прогнозы. Поздравляем с успешной разработкой модели CNN для классификации изображений.

Ключевые выводы и выводы

  • Мы можем достичь точности обучения 93,53% и точности проверки 90,89% с помощью алгоритма CNN. Наш алгоритм также очень хорошо работает на невидимом тестовом наборе данных изображений от Kaggle. (Однако из-за того, что метки не предусмотрены для набора тестов на Kaggle, мы не можем проверить общую точность теста).
  • Наш алгоритм CNN с огромным отрывом превосходит модель логистической регрессии, используемую в части 1. Таким образом, доказательство того, что алгоритмы CNN намного лучше справляются с задачами компьютерного зрения по сравнению с другими алгоритмами машинного обучения.
  • Мы можем еще больше повысить точность за счет увеличения объема данных. Это то, что я оставляю вам, чтобы вы попытались увидеть результаты.
  • В общем репозитории GitHub используются разные архитектуры, и, наконец, показанная архитектура признана лучшей. Вы можете увидеть репозиторий, чтобы лучше понять, как итеративно выбирать правильную архитектуру и правильный набор гиперпараметров для вашей собственной задачи.

Код Github: Репозиторий кода для этого сообщения написан на Google Colab.



Профиль Linkedin: вы также можете подписаться на меня в LinkedIn



Если вам нравится эта статья, покажите свою любовь, щелкнув значок Clap.