Что такое PyTorch ?
Глубокое обучение - это раздел Машинного обучения, где разрабатываются алгоритмы, имитирующие работу человеческого мозга. Наиболее часто используемые библиотеки в глубоком обучении - это Tensorflow и PyTorch. Pytorch - это открытая платформа глубокого обучения, доступная с интерфейсами Python и C++. PyTorch находится внутри модуля torch. В PyTorch данные для обработки подаются в виде тензора.
Оглавление
Как установить Pytorch?
Если у вас установлен менеджер пакетов Python Anaconda, тогда, используя следующую команду в терминале, вы можете установить PyTorch:
Эта команда установит последнюю стабильную версию PyTorch. Стабильная версия представляет собой наиболее полно протестированную и поддерживаемую версию PyTorch. Последняя стабильная версия Pytorch - 1.12.1. Если вы хотите использовать PyTorch, не устанавливая его явно на вашем локальном компьютере, вы можете использовать Google Colab.
Как работает PyTorch?
Вот обзор того, как работает PyTorch:
Тензоры: В основе PyTorch лежит класс torch.Tensor, который представляет собой многомерный массив, похожий на массивы NumPy.
Динамические Вычислительные Графы: В PyTorch граф строится по мере выполнения операций, что позволяет динамически изменять его во время выполнения. Это контрастирует со статическими вычислительными графами, используемыми некоторыми другими фреймворками глубокого обучения.
Автоград (Autograd): Он автоматически вычисляет градиенты тензоров по отношению к какому-либо скалярному значению. Это имеет решающее значение для обучения нейронных сетей с использованием алгоритмов оптимизации на основе градиента.
Нейронно Сетевой Модуль (Neural Network Module): PyTorch предлагает модуль torch.nn
, который включает в себя предопределенные слои, функции потерь и другие компоненты для построения нейронных сетей. Пользователи также могут определять собственные архитектуры нейронных сетей, создавая подклассы класса torch.nn.Module
Тензоры PyTorch
Pytorch используется для обработки тензоров. Тензоры являются многомерными массивами, подобными n-мерному массиву NumPy. Однако, в отличие от массивов NumPy, тензоры также могут использоваться в GPU, что ускоряет научные вычисления с тензорами, поскольку в PyTorch есть различные встроенные функции.
Вектор является одномерным тензором, а матрица - двумерным тензором. Одно из существенных отличий между тензором и многомерным массивом, используемым в C, C++ и Java, заключается в том, что в тензорах все размеры столбцов должны быть одинаковыми во всех измерениях. Также тензоры могут содержать только числовые типы данных.
Два фундаментальных атрибута тензора это:
Форма: относится к размерности массива или матрицы
Ранг: обозначает количество измерений тензора
Пример 1:
Создание тензора в PyTorch
В PyTorch существует несколько способов создания тензоров. Тензор может содержать элементы только одного типа данных. Создать тензор можно, используя список Python или массив NumPy. В Torch есть 10 вариантов тензоров как для GPU, так и для CPU. Ниже приведены различные способы определения тензора.
torch.Tensor() : Копирует данные и создает тензор. Является псевдонимом для torch.FloatTensor.
torch.tensor() : Также копирует данные для создания тензора, однако определяет тип данных автоматически.
torch.as_tensor() : В этом случае данные не копируются, а используются общие, при создании тензора, и метод принимает массив любого типа для создания тензора.
torch.from_numpy() : Это аналог tensor.as_tensor(), однако принимает только массивы numpy.
Пример 2:
Реструктуризация тензоров в Pytorch
Мы можем изменять форму и размер тензора по желанию в PyTorch. Также мы можем создать транспонирование n-мерного тензора. Ниже приведены три распространенных способа изменения структуры вашего тензора по желанию:
.reshape(a, b) : возвращает новый тензор размера a,b
.resize(a, b) : возвращает тот же тензор размера a,b
.transpose(a, b) : возвращает транспонированный тензор по измерениям a и b
Матрица 2*3 была преобразована и транспонирована в 3*2. Мы можем визуализировать изменение расположения элементов в тензоре в обоих случаях.
Пример 3:
Математические операции с тензорами в PyTorch
Мы можем выполнять различные математические операции с тензорами, используя Pytorch. Код для выполнения математических операций такой же, как и в случае с массивами NumPy. Ниже приведен код для выполнения четырех основных операций с тензорами.
Пример 4:
Python3
Для того чтобы более глубоко понять умножение матриц с использованием Pytorch, вы можете обратиться к этой статье –
Модули Pytorch
Библиотека PyTorch и её модули необходимы для создания и обучения нейронных сетей. Три основных модуля библиотеки – это Autograd, Optim и nn.
1. Модуль Autograd: Autograd предоставляет функциональность легкого расчета градиентов без необходимости вручную реализовывать прямой и обратный проход для всех слоев.
Для обучения любой нейронной сети мы используем метод обратного распространения ошибки для расчета градиента. Вызвав функцию .backward(), мы можем рассчитать каждый градиент от корня к листу.
Пример 5:
2. Модуль Optim: Модуль PyTorch Optim, который помогает в реализации различных алгоритмов оптимизации. Этот пакет содержит наиболее часто используемые алгоритмы, такие как Adam, SGD и RMS-Prop. Для использования torch.optim сначала нужно создать объект Optimizer, который будет хранить параметры и обновлять их соответственно. Сначала мы определяем Optimizer, указав алгоритм оптимизации, который хотим использовать. Мы устанавливаем градиенты в ноль перед обратным распространением. Затем для обновления параметров вызывается optimizer.step().
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # определение оптимизатора
optimizer.zero_grad() # обнуление градиентов
optimizer.step() # обновление параметров
3. Модуль nn: Этот пакет помогает в построении нейронных сетей. Он используется для создания слоев.
Для создания модели с одним слоем мы можем просто определить её, используя nn.Sequential().
model = nn.Sequential( nn.Linear(in, out), nn.Sigmoid(), nn.Linear(_in, _out), nn.Sigmoid() )
Для реализации модели, которая не представляет собой единую последовательность, мы определяем модель путем наследования класса nn.Module.
Пример 6:
Набор данных PyTorch и загрузчик данных
Класс torch.utils.data.Dataset
содержит все пользовательские наборы данных. Для создания собственного класса набора данных нам необходимо реализовать два метода: __len__()
и __get_item__()
. Загрузчик данных PyTorch обладает удивительной функцией параллельной загрузки набора данных с автоматической пакетной обработкой. Это значительно сокращает время, необходимое для последовательной загрузки набора данных, тем самым увеличивая скорость.
Syntax: DataLoader(dataset, shuffle=True, sampler=None, batch_sampler=None, batch_size=32)
PyTorch DataLoader поддерживает два типа наборов данных:
Map-style datasets (Наборы данных в стиле карты): Элементы данных сопоставляются с индексами. В этих наборах данных метод __get_item__() используется для получения индекса каждого элемента.
Iterable-style datasets (Наборы данных в стиле итерируемых объектов): В этих наборах данных реализован протокол __iter__(). Образцы данных извлекаются последовательно.
Пожалуйста, ознакомьтесь со статьей о использовании DataLoader в PyTorch, чтобы узнать больше.
Создание нейронной сети с помощью PyTorch
Мы увидим это в поэтапной реализации:
Подготовка набора данных: Поскольку в PyTorch все представлено в форме тензоров, прежде всего мы должны представить данные в виде тензоров.
Построение модели: Для создания нейронной сети сначала мы определяем количество входных, скрытых и выходных слоев. Также необходимо определить начальные веса. Значения матриц весов выбираются случайным образом с использованием torch.randn(). Torch.randn() возвращает тензор, состоящий из случайных чисел, следуя стандартному нормальному распределению.
Прямое распространение: Данные подаются на нейронную сеть, и выполняется матричное умножение между весами и входом. Это можно легко сделать с помощью torch.
Вычисление потерь: Функции PyTorch.nn включают в себя множество функций потерь. Функции потерь используются для измерения ошибки между предсказанным и целевым значениями.
Обратное распространение: Используется для оптимизации весов. Веса изменяются таким образом, чтобы минимизировать потери.
Давайте создадим нейронную сеть с нуля:
Пример 7:
Last updated