В этом руководстве я представлю 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