# Использование сверточной нейронной сети (CNN) - Керас
Благодаря наличию огромного объема данных и вычислительной мощности алгоритмы глубокого обучения работают все лучше и лучше. Алгоритмы глубокого обучения способны достичь высочайшего уровня производительности в задачах компьютерного зрения, во многих случаях превосходя производительность человека.
В этой серии статей «Keras Dogs vs.Cats Challenge» я постараюсь дать вам общее представление о решении любой проблемы классификации изображений. мы решим проблему «Собаки против кошек» с помощью:
- Часть 1 - Логистическая регрессия с использованием Scikit Learn
- Часть 2 - сверточная нейронная сеть (CNN) с использованием Keras Framework
- Часть 3 - Передача обучения с использованием модели Inception v3
Весь код будет размещен в репозитории 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.