В этой статье мы просто обсудим, что такое глубокое обучение, что такое сверточные нейронные сети (CNN) и как мы можем создать простую модель CNN. В этой статье предполагается, что у вас есть базовые знания в области искусственного интеллекта, машинного обучения и программирования на Python.
Что такое глубокое обучение?
Глубокое обучение - одна из составляющих машинного обучения и искусственного интеллекта. Методы глубокого обучения пытаются имитировать функцию человеческого мозга при обработке данных и нахождении в них закономерностей. Глубокое обучение можно использовать как для обучения с учителем, так и без него. Глубокое обучение использует искусственные нейронные сети, разработанные с учетом функций нейронов мозга, для выполнения различных задач. Методы глубокого обучения используются во многих различных областях, таких как классификация изображений, создание текста и прогнозирование погоды.
В этой статье мы создадим сверточную нейронную сеть для классификации некоторых изображений.
Сверточная нейронная сеть:
Сверточные нейронные сети или CNN - это тип метода глубокого обучения, обычно используемый для классификации изображений и извлечения признаков. Чтобы понять, как работают CNN, нам сначала нужно понять некоторые концепции:
- Данные изображения
- Сверточные слои
- Объединение слоев
- Плотные слои
Данные изображения. Каждое изображение состоит из трех компонентов: высоты, ширины и каналов. Количество каналов представляет глубину изображения и соотносится с цветами, использованными при создании изображения. Например, изображения RGB имеют 3 канала, по одному для каждого основного цвета, использованного для его создания. Итак, для каждого пикселя у нас есть 3 (количество каналов) значений от 0 до 255.
Плотные слои. Плотные слои - это полностью связанные слои в нейронных сетях. Каждый нейрон в плотном слое получает информацию от всех нейронов предыдущего слоя. Плотные слои - это наиболее часто используемые слои в нейронных сетях. Выход плотного слоя с M нейронами представляет собой M-мерный вектор. Этот тип слоя обычно используется в конце нейронной сети, чтобы определить, к какому классу принадлежит изображение.
Сверточные слои. Каждая сверточная нейронная сеть состоит из одного или нескольких сверточных слоев. Эти слои являются основным строительным компонентом CNN, и им поручено находить в изображениях закономерности, которые можно использовать для классификации изображений. В то время как плотные слои используются для глобального поиска объектов на изображении, сверточные слои обнаруживают шаблоны локально. Когда у нас есть плотно связанный слой, каждый узел в этом слое видит все данные из предыдущего слоя. Это означает, что этот уровень просматривает всю информацию и способен анализировать данные только в глобальном масштабе. Сверточные слои используют фильтры для обнаружения этого локального шаблона. Каждый сверточный слой состоит из нескольких фильтров одинакового размера, каждый из которых ищет различную информацию внутри изображения. Фильтр - это набор пикселей размером m x n, который мы ищем на изображении. Выходные данные сверточного слоя будут иметь глубину, равную количеству фильтров, используемых в этом слое. Если вы хотите узнать больше о фильтрах и о том, как они работают, прочтите эту статью.
Объединение слоев. Объединение слоев используется для уменьшения разрешения сверточных слоев и уменьшения его размеров. Существует 3 типа объединения: максимальное объединение, минимальное объединение, среднее объединение. Объединение обычно выполняется с использованием окна 2x2 с шагом 2, что уменьшает размер вывода в 2 раза.
Теперь, когда мы знакомы с компонентами построения сверточной нейронной сети, мы можем обсудить ее архитектуру и способы ее создания.
Создание модели:
В этой статье мы будем использовать Keras и Tensorflow для создания нашего собственного классификатора изображений. Этот классификатор изображений будет классифицировать изображения в Cifar Image Dataset в один из 10 доступных классов. Этот набор данных включает 60000 изображений 32x32, каждый из которых содержит 6000 изображений. Метки для этих классов: Самолет, Автомобиль, Птица, Кошка, Олень, Собака, Лягушка, Лошадь, Корабль, Грузовик.
Как упоминалось выше, мы собираемся использовать Keras и Tensorflow для создания нашей модели. Вы можете установить Keras и Tensorflow на свое собственное устройство или использовать такие платформы, как Google Colaboratory, для написания и запуска кода для своей модели.
Если вы, как и я, используете ноутбук Google Colab, первое, что вам нужно сделать, это включить аппаратное ускорение с помощью графического процессора внутри вашего ноутбука. Это позволяет вашей модели использовать графический процессор на этапе обучения и тестирования, что значительно ускоряет процесс. Чтобы активировать аппаратное ускорение, нажмите меню «Правка» в верхней части экрана, затем нажмите «Настройки ноутбука» и в новом окне выберите графический процессор в качестве аппаратного ускорителя. Если вы ранее запускали что-либо в записной книжке, вам необходимо сбросить и перезапустить код.
Чтобы проверить, подключен ли Tensorflow к графическому процессору или нет, вы можете запустить приведенный ниже фрагмент кода в своем ноутбуке.
Теперь мы собираемся загрузить наш набор данных. Для этого мы собираемся использовать Keras API для загрузки набора данных Cifar-10.
Запустив приведенный выше код, мы загрузили набор данных Cifar-10 и разделили его на сегменты обучения и тестирования. Обучающий сегмент используется для обучения модели, а тестовая часть данных используется для оценки точности нашей модели. Чтобы увидеть, что на самом деле находится внутри набора данных, вы можете запустить приведенный ниже код, чтобы построить некоторые изображения в наборе данных.
Вы должны получить такой вывод, показывающий изображения данных в каждом классе.
Поскольку изображения в наборе данных Cifar-10 имеют размер 32x32, выходные изображения не высокого качества. Еще одна вещь, которую нам лучше сделать, прежде чем создавать модель и передавать набор данных в качестве входных данных, - это нормализовать значения пикселей изображений между 0 и 1. Мы делаем это для того, чтобы во время фазы обратного распространения мы не превышали / не превышали компенсировать корректировку веса нейронов.
Когда набор данных готов к обработке, мы собираемся создать простую CNN с нуля для обработки этих данных. Как упоминалось ранее, мы будем использовать Keras для создания этой модели. Keras действует как интерфейс для библиотеки машинного обучения Tensorflow, что значительно ускоряет и упрощает разработку моделей. Здесь мы будем создавать с помощью Keras последовательную модель. Последовательные модели - это, по сути, линейный набор слоев. Сначала мы импортируем слои и модели из библиотеки keras. Затем мы создаем новую последовательную модель и определяем различные слои внутри модели.
Давайте посмотрим, что делает каждая часть кода. Как видите, мы создали последовательную модель и добавили к ней несколько слоев. Первый добавленный слой - это сверточный 2D-слой. Первый аргумент внутри слоя - это количество фильтров, которые мы хотим, чтобы этот сверточный слой имел, а следующий аргумент (3,3) определяет размер этих фильтров. input_shape используется только для первого слоя в последовательной модели и определяет форму входных данных, которые в данном случае представляют собой 3-канальное изображение 32x32. Наконец, у нас есть функция активации для слоя. Функции активации используются для определения выхода каждого узла или нейрона внутри слоя. Чтобы понять, что делают функции активации и какие существуют функции активации, вы можете прочитать эту статью. Заяц, мы будем использовать ReLU в качестве функции активации этого слоя.
Затем у нас есть слой объединения, чтобы уменьшить размер и размеры вывода сверточных слоев. Мы будем использовать слой MaxPooling2D размером 2x2, который выбирает наибольшее число в каждом окне 2x2 входных данных. У нас есть еще 2 сверточных слоя и еще 1 слой объединения в этой модели. Выход последнего сверточного слоя - 1x1x64. Мы сгладим этот вывод во входные данные 1D с 64 значениями для следующего за ним плотного слоя. Последний слой, который у нас есть, - это еще один плотный слой размером 10. Этот слой в основном является классификатором модели, который определяет, к какому из 10 классов принадлежит входное изображение. Используя строку model.summary (), мы можем увидеть архитектуру только что созданной модели.
Вы можете увидеть, что каждый слой делает с формой данных и сколько обучаемых параметров у нас есть в каждом слое. Теперь, когда мы определили архитектуру нашей модели, нам нужно скомпилировать и запустить ее. Чтобы скомпилировать модель, мы запускаем строку кода ниже.
Оптимизаторы - это методы, используемые для минимизации функции потери ошибок в нашей модели. Оптимизаторы помогают узнать, как изменить веса и скорость обучения нейронных сетей, чтобы уменьшить потери. Существует множество функций активации, из которых наиболее часто используется «Адам». В качестве функции потерь здесь мы используем разреженную категориальную перекрестную энтропию. Мы также выбираем список показателей, которые будут оценивать модель во время обучения и тестирования. Наша модель готова. Все, что нам нужно сделать сейчас, это запустить его на наших обучающих и тестовых наборах данных и посмотреть, насколько хорошо он классифицирует изображения.
В этой функции эпохи определяют, сколько раз мы хотим, чтобы весь набор данных проходил через модель. Слишком много эпох может привести к переобучению, в то время как слишком малое количество эпох может не позволить модели достичь максимальной точности. Вы должны получить точность около 70%, что вполне прилично для такой простой модели.
Вы можете изменить функции активации в слоях, оптимизаторе и количестве эпох, чтобы увидеть, что произойдет с конечным результатом.
Я надеюсь, что эта статья помогла вам больше узнать об этих концепциях.