В этой статье я покажу, как строить нейронную сеть с нуля. Пример прост и коротко, чтобы облегчить понять, но я не взял никаких ярлыков для скрытия деталей.
Ищете Tensorflow версии этого же урожая? Иди сюда.
import torch import matplotlib.pyplot as plt
Сначала мы создаем случайные данные. X – только 1-D тензор, и модель предсказует одно значение y.
x = torch.tensor([[1.,2.]]) x.shape CONSOLE: torch.Size([1, 2]) y = 5.
Параметры инициализируются с использованием нормального распределения, где среднее значение равно 0 и дисперсия 1.
def initalize_parameters(size, variance=1.0): return (torch.randn(size) * variance).requires_grad_() first_layer_output_size = 3 weights_1 = initalize_parameters( (x.shape[1], first_layer_output_size)) weights_1, weights_1.shape CONSOLE: (tensor([[ 0.3575, -1.6650, 1.1152], [-0.2687, -0.6715, -1.2855]], requires_grad=True), torch.Size([2, 3])) bias_1 = initalize_parameters(1) bias_1, bias_1.shape CONSOLE: (tensor([-2.5051], requires_grad=True), torch.Size([1])) weights_2 = initalize_parameters((first_layer_output_size,1)) weights_2, weights_2.shape CONSOLE: (tensor([[-0.9567], [-1.6121], [ 0.6514]], requires_grad=True), torch.Size([3, 1])) bias_2 = initalize_parameters([1]) bias_2, bias_2.shape CONSOLE: (tensor([0.2285], requires_grad=True), torch.Size([1]))
Нейронная сеть содержит две линейные функции и одна нелинейная функция между ними.
def simple_neural_network(xb): # linear (1,2 @ 2,3 = 1,3) l1 = xb @ weights_1 + bias_1 # non-linear l2 = l1.max(torch.tensor(0.0)) # linear (1,3 @ 3,1 = 1,1) l3 = l2 @ weights_2 + bias_2 return l3
Функция потери измеряет, насколько близки прогнозы к реальным значениям.
def loss_func(preds, yb): # Mean Squared Error (MSE) return ((preds-yb)**2).mean()
Ставка обучения снижает градиент, убедившись, что параметры не изменяются слишком сильно на каждом шаге.
lr = 10E-4
Функция помощника, которая обновляет параметры, а затем очищает градиент.
def update_params(a): a.data -= a.grad * lr a.grad = None
Обучение содержит три простых шага:
- Предсказывать
- Рассчитайте, насколько хороша прогноз сравнивается с реальным значением (при расчете потери он автоматически рассчитывает градиент, поэтому нам не нужно думать об этом)
- Обновление параметров, вычитая курс обучения градиента
Код продолжает принимать шаги до тех пор, пока потеря не будет меньше или равно 0,1. Наконец это графики потери изменения.
losses = [] while(len(losses) == 0 or losses[-1] > 0.1): # 1. predict preds = simple_neural_network(x) # 2. loss loss = loss_func(preds, y) loss.backward() # 3. update parameters update_params(weights_1) update_params(bias_1) update_params(weights_2) update_params(bias_2) losses.append(loss) plt.plot(list(range(len(losses))), losses) plt.ylabel('loss (MSE)') plt.xlabel('steps') plt.show()
Он много меняется, сколько шагов нужно, чтобы добраться до потери до 0,1.
Исходный код на Github
Оригинал: “https://dev.to/lankinen/neural-network-from-scratch-using-pytorch-457k”