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

В предыдущем посте я объяснил, как можно объединить PyTorch и XGBoost для передачи обучения.



Это был довольно нетрадиционный способ передачи обучения, смешивания глубоких нейронных сетей и деревьев с градиентной загрузкой. Чтобы проиллюстрировать этот метод, я объясняю, как знания, полученные AlexNet для категоризации изображений из набора данных ILSVRC, могут быть перенесены в другой вариант использования с XGBoost: идентифицировать рукописные цифры.

Через несколько дней после написания этого поста я понял, что наиболее распространенный вариант использования, включающий трансферное обучение только с нейронными сетями, на самом деле не был охвачен онлайн для PyTorch. Однако в отличной статье Дипанджана (DJ) Саркара глубокое обучение подробно представлено с некоторым кодом, но с использованием Keras.



Я очень рекомендую прочитать этот пост.

В этом посте мы собираемся заполнить этот пробел, касающийся трансферного обучения и pytorch.

Мы выполним ту же передачу, что и в предыдущем посте, используя только метод нейронной сети, и сравним производительность при смешивании XGBoost или использовании только нейронных сетей.

Мотивации

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

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

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

Возможность использовать эти предварительно обученные вычислительные уровни функций очень привлекательна.

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

Пример использования MNIST

Для простоты мы хотим использовать базу данных, легко доступную на Python. МНИСТ выглядит неплохим кандидатом. Это открытый исходный код, и его можно загрузить за секунду с помощью TorchVision. Наборы поездов и тестов довольно большие: 60k изображений для набора поездов и 10k для тестового набора. Более того, они не имеют тех же размеров, что и изображения, используемые для обучения AlexNet. Интересно посмотреть, как мы с этим справимся.

AlexNet изначально был обучен категоризировать изображения ILSVRC с помощью 1 000 меток. Во время этого обучения он научился создавать визуальные функции с помощью сверточной нейронной сети с глубоким объемом памяти. Предположение, которое мы делаем в этой части, состоит в том, что эти функции могут быть повторно использованы для выполнения совершенно другой классификации, т.е. е. идентифицируйте рукописные цифры с помощью всего 10 этикеток.

Ретаргетинг Alex Net

На этом этапе нам нужен способ сохранить структуру и веса слоев объектов и переобучить классификационные слои.

Это достигается с помощью кода ниже:

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

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

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

Учимся распознавать рукописные цифры

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

Благодаря pytorchvision и pytorch это довольно простая задача. В приведенном ниже коде объясняется, как:

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

Количество этикеток уменьшено с 1 тыс. До 10.

В конце обучения, которое на моем ноутбуке занимает некоторое время, модель сериализуется и сохраняется. Мы собираемся использовать этот дамп, чтобы оценить производительность этой передачи и убедиться, что этот подход актуален.

Оценка

scikit Learns предоставляет два удобных метода для оценки производительности модели классификации: confusion_matrix и classification_report.

Первый подсчитывает метки, используемые для каждого класса, на основе реального значения. Второй вычисляет стандартные функции, такие как оценка f1, отзыв, точность и т. Д.

Мы собираемся применить эти два метода к набору тестовых данных, предоставленному torchvision. Этот набор данных содержит 10 тыс. Рукописных цифр, что является приличным размером для проверки.

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

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

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

Вывод

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

Используя pytorch и pytochvision, это можно сделать в очень ограниченном количестве строк.

В этом посте мы использовали знания, полученные на изображениях, чтобы применить их к другим изображениям. Я почти уверен, что мы могли бы достичь достойных результатов и с любым другим сигналом, например с 1D-сигналом.