Сверточная нейронная сеть (CNN) - это особый тип глубокой нейронной сети, которая отлично справляется с задачами компьютерного зрения, такими как классификация изображений, обнаружение объектов и т. д. В этой статье мы собираемся создать классификатор изображений. с Tensorflow, реализовав CNN для классификации кошек и собак.

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

Как работает CNN?

CNN состоит из нескольких сверточных слоев, объединяющих слоев и плотных слоев.

Идея сверточного слоя состоит в том, чтобы преобразовать входное изображение, чтобы выделить особенности (например, уши, нос, лапы кошек и собак), чтобы правильно их различать. Это делается путем свертки образа с ядром. Ядро специализируется на извлечении определенных функций. Можно применить несколько ядер к одному изображению для захвата нескольких функций.

Обычно к свернутым значениям применяется функция активации (например, tanh, relu) для увеличения нелинейности.

Задача уровня объединения - уменьшить размер изображения. Он сохранит только самые важные функции и удалит остальную часть изображения. Более того, это также снизит вычислительные затраты. Самыми популярными стратегиями объединения являются максимальное объединение и среднее значение пула.

Размер матрицы объединения будет определять уменьшение изображения. Бывший. 2x2 уменьшит размер изображения на 50%

Эти серии сверточных слоев и слоев объединения помогут идентифицировать особенности, и за ними последуют плотные слои для обучения и прогнозирования позже.

Построение классификатора изображений

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

Скачайте и загрузите набор данных

Этот набор данных содержит 2000 изображений кошек и собак в формате jpg. Во-первых, нам нужно загрузить набор данных и извлечь его (здесь данные загружаются в каталог / tmp в экземпляре Colab).

Приведенные выше сегменты кода загрузят наборы данных и извлекут их в каталог / tmp. Извлеченный каталог будет иметь 2 подкаталога с именами train и validation. У них будут данные для обучения и тестирования. Внутри обоих этих каталогов есть 2 подкаталога для кошек и собак. Мы можем легко загрузить эти данные обучения и тестирования для двух классов с помощью генератора данных TensorFlow.

Здесь у нас есть 2 генератора данных для обучающих и тестовых данных. При загрузке данных применяется изменение масштаба, чтобы нормализовать значения пикселей для более быстрой сходимости модели. Более того, при загрузке данных мы делаем это 20 партиями изображений, и все они масштабируются до размера 150x150. Если есть изображения разных размеров, это исправит.

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

Поскольку данные готовы, теперь мы можем построить модель. Здесь я собираюсь добавить 3 сверточных слоя, за которыми следуют 3 слоя с максимальным объединением. Затем идет слой Flatten и, наконец, есть 2 плотных слоя.

В первый слой свертки я добавил 16 ядер размером 3x3. Как только изображение свернуто с ядром, оно будет передано через активацию relu для получения нелинейности. Входная форма этого слоя должна быть 150x150, поскольку мы изменили размер изображений для этого размера. Поскольку все изображения являются цветными, у них есть 3 канала для RGB.

На уровне max-pooling я добавил ядро ​​2x2, так что максимальное значение будет взято при уменьшении размера изображения на 50%.

Есть 3 таких слоя (свертка и максимальное объединение) для извлечения характеристик изображений. Если есть очень сложные функции, которые необходимо изучить, следует добавить в модель больше слоев, чтобы сделать ее намного глубже.

Слой Flatten принимает выходные данные из предыдущего слоя max-pooling и преобразует их в одномерный массив, чтобы его можно было передать в слои Dense. Плотный слой - это регулярный слой нейронов в нейронной сети. Именно здесь происходит фактический процесс обучения путем корректировки весов. Здесь у нас есть 2 таких плотных слоя, и поскольку это двоичная классификация, в выходном слое всего 1 нейрон. Количество нейронов в другом слое можно настроить как гиперпараметр для получения наилучшей точности.

Обучите модель

Поскольку мы построили модель, теперь мы можем ее скомпилировать.

Здесь нам нужно определить, как рассчитать потерю или ошибку. Поскольку мы используем двоичную классификацию, мы можем использовать binary_crossentropy. С помощью параметра оптимизатора мы передаем, как настроить веса в сети, чтобы уменьшить потери. Есть много вариантов, которые можно использовать, и здесь я использую метод RMSprop. Наконец, параметр metrics будет использоваться для оценки того, насколько хороша наша модель, и здесь мы используем точность.

Теперь мы можем приступить к обучению модели.

Здесь мы передаем генераторы поездов и проверки, которые мы использовали для загрузки наших данных. Поскольку наш генератор данных имеет размер пакета 20, нам нужно иметь 100 stps_per_epoch для покрытия всех 2000 обучающих изображений и 50 для проверочных изображений. Параметр эпохи устанавливает количество итераций, которые мы проводим для обучения. Параметр verbose покажет прогресс на каждой итерации во время обучения.

Полученные результаты

После 15 эпох модель набрала 98,9% точности на обучающем наборе и 71,5% точности на проверочном наборе. Это явный признак того, что наша модель переоснащена. Наша модель будет очень хорошо работать в обучающем наборе и плохо работать с невидимыми данными.

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

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

Увеличение изображения

Идея Image Augmentation состоит в том, чтобы создавать больше изображений путем изменения размера, масштабирования, поворота изображений и т. Д. Для создания новых изображений. При таком подходе модель сможет охватить больше функций, чем раньше, и сможет хорошо обобщить невидимые данные.

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

Из-за этого классификатор может не правильно идентифицировать изображения, подобные приведенным ниже, поскольку он не обучался с подобными примерами.

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

Добавить увеличение изображения с помощью генератора изображений TensorFlow очень просто. Когда применяется увеличение изображения, исходный набор данных останется нетронутым, и все манипуляции будут выполняться в памяти. Следующий фрагмент кода покажет, как добавить эту функциональность.

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

После применения увеличения изображения можно получить точность обучения 86% и точность тестирования 81%. Как видите, эта модель не переоснащена, как раньше, и с таким очень маленьким набором данных, эта точность впечатляет. Кроме того, вы можете повысить точность, играя с гиперпараметрами, такими как оптимизатор, количество плотных слоев, количество нейронов в каждом слое и т. Д.