1 задание
Прежде всего, давайте поговорим об учебных задачах, которые должна решать сеть, которую мы хотим построить: Пусть наша нейронная сеть выучит логическую операцию XOR, операцию XOR, также широко известную как «одно и то же принимает 0, разница принимает 1». Давайте упростим наши потребности, то есть нам нужно построить такую нейронную сеть, пусть при вводе (1, 1) мы выводим 0, а при вводе (1, 0) выводим 1 (один и тот же дубль 0, разные дубли 1) , и так далее.
2 Идеи реализации
Поскольку наши требования должны иметь два входа и один выход, нам нужно установить два входных узла во входном слое и один выходной узел в выходном слое. Поскольку проблема относительно проста, нам нужно всего лишь установить 10 узлов в скрытом слое для достижения хороших результатов.Функция активации скрытого слоя использует функцию ReLU, а выходной слой использует функцию Sigmoid, чтобы поддерживать вывод от 0 до 1. Диапазон, если выход больше 0,5, результат вывода может быть установлен на 1, меньше 0,5, результат вывода может быть установлен на 0.
3 Процесс реализации
Используемый нами простой метод быстрой сборки.
3.1 Импорт необходимых библиотек
import torch
import torch.nn as nn
import numpy as np
Чтобы использовать pytorch, конечно, вам нужно ввести пакет torch, а затем заменить nn в пакете torch на nn для удобства написания кода.Пакет nn — это аббревиатура нейронной сети, пакета, специально используемого для построения нейронная сеть. Numpy был введен для создания матриц в качестве входных данных.
3.2 Создание тренировочного набора
# 构建输入集
x = np.mat('0 0;'
'0 1;'
'1 0;'
'1 1')
x = torch.tensor(x).float()
y = np.mat('1;'
'0;'
'0;'
'1')
y = torch.tensor(y).float()
Лично я предпочитаю использовать np.mat для построения матриц.Я чувствую, что метод записи относительно прост.Конечно, вы также можете использовать другие методы. Но после построения матрицы должен быть этот шагtorch.tensor(x).float()
, вы должны преобразовать созданный вами ввод в тензорную переменную.
Что такое тензор? Вы можете просто понять, что это переменная, используемая в pytorch.Если вы хотите использовать структуру pytorch, вы должны сначала преобразовать свои переменные в тензорные переменные. И наша нейронная сеть потребует, чтобы ваши входные и выходные данные были плавающими, что относится к плавающей запятой в тензорной переменной, а ввод, который вы создаете с помощью np.mat, имеет тип int, и преобразование в тензор также будет автоматически преобразовано в тип тензора int, поэтому добавьте .float() после него, чтобы преобразовать его в тип с плавающей запятой.
Таким образом, мы завершили построение входа и выхода (матрица x и матрица y соответственно), x - матрица с четырьмя строками и двумя столбцами, каждая ее строка является входом, а на вход подаются два значения. раз, здесь мы помещаем все входные случаи перечислены. Выход y представляет собой матрицу с четырьмя строками и одним столбцом, каждая строка является выходом, соответствующим входу каждой строки матрицы x.
3.3 Построить сеть
myNet = nn.Sequential(
nn.Linear(2,10),
nn.ReLU(),
nn.Linear(10,1),
nn.Sigmoid()
)
print(myNet)
Выходной результат:
Мы используем Sequential в пакете nn для построения сети, Эта функция — единственная вещь, которая позволяет нам строить нейронную сеть, как строительные блоки.
nn.Linear(2,10) означает создание входного слоя, где 2 представляет количество входных узлов, а 10 — количество выходных узлов. Линейный — это линейный по-английски, что означает, что этот слой не включает никаких других функций активации, и то, что вы вводите, даст вам результат. nn.ReLU() Это означает размещение слоя функции активации и добавление вашего ввода в функцию ReLU. Затем появился еще один Linear, и, наконец, он перекинул его в функцию Sigmoid. 2, 10 и 1 соответственно представляют количество трех слоев, что просто и ясно.
3.4 Настройка оптимизатора
optimzer = torch.optim.SGD(myNet.parameters(),lr=0.05)
loss_func = nn.MSELoss()
Понимание этого шага заключается в том, что вам нужен оптимизированный метод для обучения вашей сети, поэтому этот шаг устанавливает метод оптимизации, который мы будем использовать.
torch.optim.SGD означает использование метода SGD (стохастический градиентный спуск) для обучения, вам нужно только передать параметры и скорость обучения вашей сети, соответственноmyNet.paramets
иlr
.loss_func
Это предложение задает функцию стоимости, поскольку наша проблема относительно проста, поэтому мы используем MSE, которая представляет собой функцию стоимости среднеквадратичной ошибки.
3.5 Обучите сеть
for epoch in range(5000):
out = myNet(x)
loss = loss_func(out,y)
optimzer.zero_grad()
loss.backward()
optimzer.step()
Я установил здесь цикл 5000 раз (вероятно, не нужно столько раз), и пусть это обучающее действие повторяется 5000 раз. Используйте myNet(x) непосредственно для каждого вывода, вбрасывайте ввод в свою сеть, чтобы получить вывод (вот как просто и грубо!), а затем используйте функцию стоимости и ваш стандартный вывод y, чтобы найти ошибку. Шаг очистки градиента заключается в том, чтобы очищать градиент, полученный в предыдущей итерации, каждый раз при повторной итерации, вам просто нужно запомнить этот шаг, и вам не нужно слишком глубоко понимать его для новичков.loss.backward()
Конечно, позвольте ошибке распространиться обратно, а затемoptimzer.step()
То есть заставить оптимизатор, который мы только что настроили, работать.
3.6 Тестирование
print(myNet(x).data)
результат операции:
Видно, что этот результат очень близок к ожидаемому нами результату.Конечно, вы также можете изменить тест данных, и результат будет аналогичным. Вот краткое объяснение того, почему мы добавили .data в конце нашего кода, потому что наша тензорная переменная на самом деле содержит две части, одна — это данные тензора, а другая — параметр автоматического вывода тензора, мы добавляем значение of .data Это вывод данных в тензоре, Если он не добавлен, он выведет следующее: