Как мы можем использовать предварительно обученную сеть, чтобы помочь нам классифицировать новый набор данных?

Введение

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

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

  1. Извлечение функций
  2. Тонкая настройка

Источником вдохновения для обоих вариантов послужил Франсуа Шоле, который создал убедительные примеры этой идеи, ссылка на которую приводится в конце этой статьи.

Цель этого эксперимента - сосредоточиться на первом варианте, извлечении функций, и мы будем использовать архитектуру ImageNet, ResNet50, в качестве нашей предварительно обученной модели. Существует множество архитектур с переносом обучения, которые можно выбрать, например, VGG16, VGG19, MobileNet и т. Д. Все они имеют свои плюсы и минусы для определенных ситуаций. Например, MobileNet призван быть быстрым и гибким и лучше всего работает на мобильных устройствах. Эти модели обучаются на наборе данных ImageNet, который содержит 1,4 миллиона помеченных изображений и 1000 различных классов. Это здорово, учитывая тот факт, что у нас может не хватить данных для захвата определенных пространственных объектов с помощью нашего небольшого набора данных, который мы хотим классифицировать. Пример архитектуры ResNet50, обученной на ImageNet, показан на рисунке 1.

Набор данных

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

Более подробную информацию о CIFAR-10 можно найти по следующей ссылке -

Https://www.cs.toronto.edu/~kriz/cifar.html

Из документации CIFAR-10: «Набор данных CIFAR-10 состоит из 60000 цветных изображений 32x32 в 10 классах, по 6000 изображений на класс. Есть 50000 обучающих изображений и 10000 тестовых изображений », которые будут использоваться в этом сценарии при обучении и тестировании нашей модели. Одна из очень прибыльных особенностей набора данных CIFAR-10 заключается в том, что нет необходимости загружать изображения отдельно и загружать их в каталог. Мы можем импортировать его из пакетов Keras Datasets. Предварительно необходимо выполнить некоторую предварительную обработку, поскольку ResNet50 требует, чтобы изображения имели как минимум 200x200 пикселей, в то время как набор данных CIFAR-10 содержит изображения размером 32x32 пикселей. Это можно сделать, предварительно изменив форму изображений или увеличив масштаб до изображений, прежде чем мы введем их в сверточные слои. На изображении 2 показано несколько примеров изображений, содержащихся в наборе данных CIFAR-10.

Модельная архитектура

Чтобы набор данных CIFAR-10 работал с ResNet50, нам нужно сначала 3 раза повысить дискретизацию наших изображений, чтобы они соответствовали сверточным слоям ResNet50, как упоминалось выше. Есть дополнительные способы сделать это, например, использовать встроенную функцию Keras ImageDataGenerator, но для целей запуска модели также будет работать повышающая дискретизация. Повышение разрешения - это просто способ увеличить изображение, чтобы сделать его больше. После того, как изображения готовы для слоев ResNet50, мы можем пройти через наши изображения, а затем взять результат, сгладить его и передать в полностью подключенную сеть, состоящую из двух скрытых слоев (один со 128 нейронами, а другой с 64 нейронами) . Оба эти уровня состоят из слоя BatchNormalization перед фактическим слоем и слоя исключения для вывода (уровень исключения имел вероятность 0,5). Наконец, у нас есть последний плотный слой в качестве выхода с 10 нейронами и выход softmax для 10 классов, которые существуют в CIFAR10. Softmax, по сути, даст нам вероятность каждого класса, в данном случае 10 результатов, которые в сумме должны равняться 1. Причина, по которой архитектура отличается от того, что изначально указал Шолле, заключалась в том, чтобы посмотреть, будет ли точность классификации потенциально увеличивать. Пакетная нормализация используется для повышения скорости, производительности и стабильности искусственных нейронных сетей, в то время как выпадение используется для удаления определенного нейрона с вероятностью 0,5, это необходимо для того, чтобы модель не просто запоминала определенные шаблоны. Краткое описание модели показано на рисунке 1.

Обучение модели

Поскольку ResNet50 является большим с точки зрения архитектуры, его обучение требует больших вычислительных ресурсов. Новые изображения из CIFAR-10 не были заранее предсказаны на слоях ResNet50, поэтому модель работала в течение 5 эпох, чтобы получить классификацию с точностью 98%. Если бы существовал более крупный набор данных, сверточную базу необходимо было бы запустить по всему набору данных, чтобы ускорить процесс обучения. Оба способа приводят к эквивалентным результатам, но способ, описанный выше, намного медленнее и требует больших вычислительных затрат. Однако это позволяет нам увеличивать объем данных во время обучения. На рисунке 2 показано, что мы можем достичь относительно высокой точности обучения и проверки всего за 5 эпох. Наши потери составили около 0,05 как для обучения, так и для проверки, в то время как точность обучения и проверки достигла уровня около 99%. Время тренировки было медленным, так как тренировка занимала примерно 10 минут в эпоху, в общей сложности 50 минут.

После обучения модель была затем оценена на тестовом наборе и достигла точности около 98,70%, как показано на рисунке 3. Это говорит нам о том, что каждый раз, когда мы передаем изображение в сеть, оно будет правильно идентифицировать изображение примерно 99 % времени.

Визуализация промежуточных действий

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

В качестве примера возьмем самолет. Поскольку CIFAR-10 имеет изображения с качеством 32x32 пикселей, мы не сможем получить наиболее точную визуализацию активации. Этот эксперимент можно провести снова с изображениями более высокого качества (с большим количеством пикселей), чтобы лучше представить, как активации выглядят для конкретного изображения. Когда изображение вводится в модель, мы получаем различные значения для разных слоев, поэтому у нас есть несколько вариантов, из которых мы потенциально можем выбрать. Давайте сосредоточимся на первом сверточном слое в ResNet50 и посмотрим на 5-й канал. Каждый канал представляет различные функции, на которых сеть фокусируется для изображения. Результаты показаны на рисунке 3 (справа) в сравнении с исходным изображением (слева). Как видите, изображение активации действительно напоминает самолет.

Заключение

Трансферное обучение - отличный метод, который можно использовать, если мы проводим эксперимент, в котором у нас нет достаточно большого набора данных. Существует довольно много моделей, которые можно использовать, большинство из которых были обучены на наборе данных ImageNet, который содержит более 1,4 миллиона изображений. Эта предварительно обученная сеть захватывает множество пространственных иерархий и, как мы видим из вышеизложенного, отлично справляется с работой, когда мы вводим набор данных, на котором она не была обучена. Нам нужно будет настроить полностью подключенную сеть к концу модели, но в итоге мы получим высокую точность классификации, в этом примере мы получили точность тестирования 98%.

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

Ссылки

Вдохновение для проделанной выше работы было получено от Франсуа Шоле, который сломал многие из этих концепций глубокого обучения на своем GitHub. См. Его следующую записную книжку по Трансферному обучению -



Пожалуйста, посмотрите его следующую записную книжку по визуализации CNN -



Репозиторий GitHub

Для полного анализа и кода, использованного для запуска модели выше, перейдите по следующей ссылке -

Https://github.com/frlim/data2040_final