Продолжая мою серию статей о создании классических конvolutionalных нейронных сетей, которые революционизировали сферу компьютерного зрения за последние 1-2 десятилетия, в следующей части мы создадим VGG, очень глубокую конvolutionaльную нейронную сеть, с нуля, используя PyTorch. Вы можете увидеть предыдущие статьи в этой серии на моем профиле, в основном LeNet5 и AlexNet.
Как и ранее, мы рассмотрим архитектуру и интуициюза VGG и результаты, которые были в то время. Затем мы исследуем нашу выборку данных CIFAR100 и загрузим ее в нашу программу с использованием эффективного кода по счету памяти. Затем мы реализуем VGG16 (число указывает на количество слоев, существуют две версии, VGG16 и VGG19) с нуля, используя PyTorch, и обучим его на нашей выборке данных, а также оценим его на нашем тестовом наборе, чтобы увидеть, как он работает с невиданными данными
VGG
Возводясь на основе работы AlexNet, VGG сфокусируется на еще одной важной аспекте конволюционных нейронных сетей (CNN), глубины. Она была разработана Simonyan и Zisserman. Она обычно состоит из 16 конволюционных слоев, но может быть расширена до 19 слоев (таким образом, есть две версии: VGG-16 и VGG-19). Все конволюционные слои состоят из фильтров 3×3. Более подробную информацию о сети вы можете прочитать в официальной статье здесь
архитектуры VGG16. Источник
Загрузка данных
Набор данных
Перед созданием модели одним из самых важных действий в любом проекте машинного обучения является загрузка, анализ и предварительная обработка набора данных. В этой статье мы будем использовать набор данных CIFAR-100. Этот набор данных похож на CIFAR-10, за исключением того, что он содержит 100 классов, каждый из которых содержит 600 изображений. Всего есть 500 тренировочных изображений и 100 тестовых изображений в каждом классе. 100 классов в CIFAR-100 разделены на 20 суперклассов. Каждое изображение сопровождается “тонкой” меткой (классом, к которому оно относится) и “толстой” меткой (суперклассом, к которому оно относится). Мы будем использовать “тонкую” метку здесь. Вот список классов в CIFAR-100:
Список классов для набора данных CIFAR-100
Импортирование библиотек
Мы будем работать главным образом с torch
(используется для создания модели и обучения), torchvision
(для загрузки/обработки данных, содержит наборы данных и методы для обработки этих наборов данных в компьютерном зрении) и numpy
(для математической манипуляции). Мы также будем определять переменную device
, чтобы программа могла использовать GPU, если он доступен
Загрузка данных
torchvision
— это библиотека, предоставляющая легкий доступ к большому количеству компьютерно-визуальных датасетов и методов их предварительной обработки в простом и интуитивно понятном для использования способе
- Мы определяем функцию
data_loader
, которая возвращает данные тренировки/валидации или тестовые данные в зависимости от аргументов - Начинаем с определения переменной
normalize
с средними значениями и стандартными отклонениями каждого канала (красного, зеленого и синего) в датасете. Эти значения можно вычислить вручную, но они также доступны в Интернете. Это используется в переменнойtransform
, где мы увеличиваем размер данных, конвертируем их в тензоры и затем нормализуем - Если аргумент
test
равенTrue
, мы просто загружаем тестовую часть датасета и возвращаем ее с помощью загрузчиков данных (подробнее см. ниже) - В случае, если
test
false (разметки по умолчанию), мы загружаем часть тренировки датасета и рандомизируем ее в тренировочную и валидационную выборку (90:10) - В конце применяем загрузчики данных. Это может не оказаться влиянием на performance при использовании маленьких данных, как CIFAR100, но它可以 серьезно ограничить performance при работе с крупными данными и обычно считается хорошей практикой. Загрузчики данных позволяют нам итерационно проходить по данным в batch’ах, и данные загружаются во время итерации, а не все в начале загрузки в вашем RAM.
VGG16 с нуля
Для создания модели с нуля, нам надо сначала понять, как работают определения моделей в torch
и различные типы слоев, которые мы будем использовать здесь:
- Каждая пользовательская модель должна наследоваться от класса
nn.Module
, так как он обеспечивает основные функции, которые помогают модели обучаться. - Второе, есть две основные вещи, которые нам нужно сделать. Первое, определить различные слои нашей модели внутри функции
__init__
и последовательность, в которой这些层次将被执行在输入上 inside theforward
function
Теперь let’s define the various types of layers that we are using here:
nn.Conv2d
: These are the convolutional layers that accepts the number of input and output channels as arguments, along with kernel size for the filter. It also accepts any strides or padding if you want to apply thosenn.BatchNorm2d
: This applies batch normalization to the output from the convolutional layernn.ReLU
: This is the activation applied to various outputs in the network.nn.MaxPool2d
: Это применяет максимальное пулинг к выходу с указанным размером ядраnn.Dropout
: Используется для применения дропаута к выходу с заданной вероятностьюnn.Linear
: Это, по сути, полностью связанный слойnn.Sequential
: Технически это не тип слоя, но помогает объединять различные операции, являющиеся частью одного шага
Используя эту информацию, мы теперь можем построить нашу модель VGG16 с использованием архитектуры из статьи:
VGG16 с нуля
Гиперпараметры
Одна из важных частей любого проекта по машинному или глубокому обучению – это оптимизация гиперпараметров. Здесь мы не будем экспериментировать с различными значениями, но мы должны определить их заранее. К ним относятся количество эпох, размер батча, скорость обучения, функция потерь вместе с оптимизатором
Установка гиперпараметров
Обучение
Мы сейчас готовы начать тренировать нашу модель. Мы сначала посмотрим, как тренировать нашу модель в torch
, а затем посмотрим на код:
- Для каждой эпохи мы проходим через изображения и метки в нашем
train_loader
и, если доступно, перемещаем эти изображения и метки на GPU. Это происходит автоматически - Мы используем нашу модель, чтобы предсказать метки (
model(images)
), а затем вычисляем потерю между предсказаниями и истинными метками с помощью нашей функции потерь (criterion(outputs, labels)
) - После этого мы используем эту потерю для обратной пропагирации (
loss.backward
) и обновляем веса (optimizer.step()
). Но помнитете установить градиенты в нуль перед каждым обновлением. Это делается с помощьюoptimizer.zero_grad()
- Также в конце каждой эпохи мы используем нашу валидационную выборку, чтобы вычислить точность модели. В этом случае мы не нужны градиенты, поэтому мы используем
with torch.no_grad()
для быстрой оценки
Теперь мы объединяем все это в следующий код:
Тренировка
Мы можем увидеть выход данного кода, как показано ниже, который действительно показывает, что модель учится, поскольку потеря уменьшается с каждой эпохой:
Потери тренировки
Тестирование
Для тестирования мы используем совершенно тот же код, что и для валидации, но с test_loader
:
Тестирование
Используя указанный выше код и обучая модель на 20 эпохах, мы смогли достичь точности 75% на тестовом наборе данных.
Заключение
Теперь let’s summarize what we did in this article:
- Начали мы с понимания архитектуры и различных типов слоев в модели VGG-16
- Далее мы загрузили и предпроцессорировали набор данных CIFAR100 с использованием
torchvision
- Потом мы использовали
PyTorch
, чтобы построить нашу модель VGG-16 с нуля, а также понять различные типы слоев, доступных вtorch
- В конце концов, мы обучили и тестировали нашу модель на наборе данных CIFAR100, и модель казалась работать хорошо на тестовом наборе данных с 75% точностью
Будущая работа
Utilizing this article, you get a good introduction and hands-on learning, but you’ll learn much more if you extend this and see what else you can do:
- Вы можете essay using различные наборы данных. Один из таких наборов данных – CIFAR10 или небольшой под набора данных ImageNet.
- Вы можете экспериментировать с различными гиперпараметрами и увидеть лучшую комбинацию их для модели
- В конечном итоге, вы можете essay добавляя или удаляя слои из набора данных, чтобы увидеть их влияние на возможности модели. еще лучше, essay создать версию VGG-19 этой модели.
Source:
https://www.digitalocean.com/community/tutorials/vgg-from-scratch-pytorch