Легкое для понимания руководство по построению нейронных сетей с помощью PyTorch с использованием популярного набора данных Titanic от Kaggle.

В этом руководстве мы увидим, как построить простую нейронную сеть для задачи классификации с использованием инфраструктуры PyTorch. Это поможет нам разобраться в основах и синтаксисе фреймворка. Для того же мы будем использовать набор данных Kaggle Titanic Dataset.

Установка PyTorch

## For Windows
pip install torch===1.5.0 torchvision===0.6.0 -f https://download.pytorch.org/whl/torch_stable.html
## For Linux
pip install torch torchvision

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

Подготовка набора данных

Сначала загрузите набор данных из Kaggle, присоединившись к конкурсу, или вы также можете получить его из других источников (поможет простой поиск в Google). После того, как вы настроите набор данных, а также пакет PyTorch, мы готовы погрузиться в дальнейшее. Перед проектированием архитектуры в первую очередь необходимо подготовить данные в соответствии с требованиями PyTorch, что можно сделать с помощью модуля Dataset, предоставляемого самим PyTorch. Если вам трудно понять, позвольте мне проанализировать это для вас. Большинство данных, с которыми вы будете иметь дело, будут структурами Numpy. Теперь их нельзя напрямую передать в сеть, поскольку они не являются тензорами. Pytorch требует, чтобы вы передавали данные в виде этих тензоров, что похоже на любой массив Numpy, за исключением того, что его также можно перенести на графический процессор во время обучения. Все ваши градиенты и веса, с которыми работает ваша сеть, будут иметь одинаковую тензорную структуру данных. По мере дальнейшего чтения блога вы сможете лучше понять. Итак, давайте загрузим данные.

Теперь мы импортируем модуль Dataset для наследования различных функций, таких как __getitem __ (), __len __ () и т. д., предопределенные в библиотеке. Эти функции помогут нам создать собственный класс для инициализации набора данных. В приведенном ниже коде показано, как создать класс набора данных.

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

Функция __init __ () считывает файл .csv, используя фрейм данных pandas, и мы выполняем некоторую предварительную обработку позже (что не имеет отношения к этому руководство). Функция __len__ () возвращает количество примеров и __ getitem __ () используется для выборки данных по их индексу. Из приведенного выше фрагмента кода важно отметить, что мы преобразовали наши обучающие примеры в тензор, используя функцию torch.tensor, вызывая ее с использованием ее индекса. Итак, на протяжении всего урока, где бы мы ни брали примеры, все они будут в форме тензоров.

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

Вы должны передать свой объект набора данных, полученный в результате предыдущей функции, в качестве аргумента. Согласно количеству пакетов результатом будет многомерный тензор формы (no_of_batches, batch_size, size_of_the_vector). Теперь количество измерений будет варьироваться для других типов данных, таких как изображения или последовательные данные, соответственно, в зависимости от их характера. Но пока просто поймите, что существует несколько партий, и каждая партия содержит несколько примеров, равных размеру партии (независимо от того, какие данные вы используете).

Сделайте вдох… Вы прошли половину пути. :)

Архитектура нейронной сети

Теперь, когда у нас есть данные, готовые для обучения, мы должны спроектировать нейронную сеть, прежде чем мы сможем начать ее обучение. Подойдет любая модель с традиционно используемыми гиперпараметрами (Adam Optimizer, MSE Loss). Чтобы закодировать нашу нейронную сеть, мы можем использовать nn.Module, чтобы создать то же самое.

nn.Linear (), nn.BatchNorm1d () становятся доступными после того, как вы унаследуете nn.Module class (). Вы можете просто использовать их, вызвав его. Поскольку мы используем простые табличные данные, мы можем использовать простой плотный слой (или полностью связанный слой) для создания модели. Для активации я использовал специальное определение swish (). Можно было бы также пойти на ReLu. ReLu доступен в модуле nn.functional (). Вы можете просто заменить swish () на F.relu (). Так как это двоичная классификация, нет необходимости использовать softmax в последнем слое. Я использовал сигмовидную функцию для классификации своих примеров. В приведенном выше коде __init __ () помогает инициализировать модель нейронной сети, как только вы вызываете конструктор и forward () функция управляет потоком данных через сеть, что делает ее ответственной за прямую связь. Когда мы перейдем к циклу обучения, вы увидите, как мы вызываем функцию пересылки.

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

Ваш тренировочный процесс можно построить следующим образом:

  • Вы определяете свои параметры обучения, такие как количество эпох, функция потерь, оптимизатор. Все оптимизаторы доступны в torch.optim (). Ваша функция оптимизатора принимает веса сети в качестве параметров. В приведенном ниже коде переменная net содержит модель нейронной сети, которую мы создали в предыдущем подразделе, а net.parameters () относятся к весам сети.
  • Каждый пакет данных передается в сеть. На основе функции потерь мы рассчитываем потери для данной партии. После расчета потерь мы вычисляем градиенты, вызывая функцию backward (). После расчета градиентов мы обновляем существующие веса. Тот же процесс происходит для каждой партии в каждую эпоху. Как я упоминал ранее, мы могли бы сделать прямую связь, просто минуя ввод в качестве аргумента нейронной сети. (Например, model (x) в приведенном ниже коде).

optimizer.step () используется для обновления весов с использованием вычисленных градиентов.

  • В конце эпохи мы делаем прогнозы на основе данных проверки. Затем, наконец, мы вычисляем точность на основе прогнозов на основе обучения, а также данных проверки.
  • Чтобы получить общее представление, я вставил всю свою тренировочную петлю ниже.
  • Основываясь на доступных вычислительных ресурсах, вы можете переместить свои данные и сеть на графический процессор, используя приведенный ниже код. Помните, какое бы устройство вы ни использовали для всех входных и выходных данных, а также сеть, оно должно быть на одном устройстве (иначе это вызовет некоторые глупые ошибки: p).

Вы закончили обучение… :) Гордитесь собой.

использованная литература

[1] https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html