В этом руководстве я представлю PyTorch Wrapper, что сэкономит нам время при разработке конвейера обучения моделей PyTorch. Мы сможем делать это блоками!

Самые продвинутые планы развития науки о данных, которые вы когда-либо видели! Поставляется с тысячами бесплатных учебных ресурсов и интеграцией ChatGPT! https://aigents.co/learn/roadmaps/intro

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

Мы добились высокой точности 97–98%, что означает, что это очень точно. Но это простая задача, потому что MNIST имеет обширный и простой набор данных.

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

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

Обертка PyTorch

Я работал над пользовательской оболочкой PyTorch, которая включена в мои Утилиты обучения машинному обучению версии 1.0.1. Эта версия поддерживает реализации TensorFlow и PyTorch. Вы можете установить его с помощью «pip install mltu==1.0.1».

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

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

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

Вначале мы загружаем и предварительно обрабатываем набор данных MNIST так же, как и раньше:

Теперь нам нужно импортировать пользовательские объекты Wrapper, которые мы будем использовать для обучения модели. Я импортирую DataProvider - он обрабатывает загрузку данных партиями в многопоточном/многопроцессорном режиме. Затем я импортирую Model — основной объект, в котором происходит вся магия. Тогда это Accuracy; вместо того, чтобы жестко кодировать расчет точности, он будет обрабатываться в Metrics. Затем, наконец, мы импортируем EarlyStopping и ModelCheckpoint, эти два объекта будут отслеживать весь процесс обучения, останавливать обучение в его лучшей точке и сохранять лучшие веса модели в нашем пути всякий раз, когда он улучшается.

Теперь нам нужно создать функцию препроцессора, которая расширит одно измерение моего изображения и нормализует данные между 0 и 1.

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

Отличный; теперь мы определяем сеть (такую ​​же, как я использовал в предыдущем уроке). Мы определяем Optimizer как Adam со скоростью обучения 0,001. И мы должны не забыть определить нашу потерю и использовать CrossEntropyLoss для задачи классификации MNIST:

Вот моя архитектура нейронной сети, которая лежит в моем файле model.py:

Помните, мы импортировали два обратных вызова? Теперь нам нужно их инициализировать:

Во-первых, мы определяем обратный вызов EarlyStopping, который будет отвечать за остановку процесса обучения, когда наша Модель перестанет улучшаться в течение заданного количества эпох. Здесь мы отслеживаем точность проверки, потому что нет смысла отслеживать точность обучения. И поскольку мы пытаемся максимизировать эту точность, мы устанавливаем режим «макс».

Во-вторых, мы инициализируем ModelCheckpoint. Имя говорит само за себя; всякий раз, когда мы достигаем большей точности проверки, чем раньше, мы сохраняем нашу модель на диске в указанном месте. Также мы устанавливаем режим «max».

Итак, мы определили большую часть материала. Мы должны инициализировать объект Model с нашей архитектурой нейронной сети, оптимизатором, потерями и метриками. Это работает так же, как мы делаем model.compile() в TensorFlow:

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

И теперь нам нужно дождаться окончания процесса обучения:

Как видите, Модель прекратила обучение на 13 эпохах с точностью проверки 98,7%. Нам не нужно было беспокоиться о том, тренировалось ли оно слишком долго или слишком коротко, а о сохранении модели все было сделано за нас.

Разве это не круто? Я пропустил это, когда использовал PyTorch для разработки плавных и аккуратных конвейеров обучения нейронных сетей, которыми я теперь делюсь с вами!

Протестируйте модель:

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

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

Теперь мы можем передать эти предварительно обработанные тестовые данные через нашу обученную модель, чтобы делать прогнозы:

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

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

Заключение:

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

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

Итак, если вам не терпится узнать, как развивается этот проект, подписывайтесь на мой YouTube-канал, следите за моим репозиторием GitHub и ждите обновлений!

Полный код этого урока вы можете найти по этой ссылке на GitHub.

Первоначально опубликовано на https://pylessons.com/pytorch-wrapper