Эта статья написана Сидатом Асири, старшим инженером-программистом группы исследований и разработок Sysco LABS.

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

В этой статье показано, как создать классификатор изображений с помощью Tensorflow путем реализации CNN для классификации кошек и собак.

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

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

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

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

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

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

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

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

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

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

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

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

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

Приведенные выше сегменты кода загрузят наборы данных и извлекут их в каталог / tmp. Извлеченный каталог будет иметь 2 подкаталога с именами поезд и проверка. В нем будут данные для обучения и тестирования.

В обоих этих каталогах есть 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%.

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