Рубрики
Без рубрики

Нейронная сеть с нуля с помощью Pytorch

В этой статье я покажу, как строить нейронную сеть с нуля. Пример простой и коротким … Теги с пейторкой, питоном, машинным обучением, нейронными сетями.

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

Ищете 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

Обучение содержит три простых шага:

  1. Предсказывать
  2. Рассчитайте, насколько хороша прогноз сравнивается с реальным значением (при расчете потери он автоматически рассчитывает градиент, поэтому нам не нужно думать об этом)
  3. Обновление параметров, вычитая курс обучения градиента

Код продолжает принимать шаги до тех пор, пока потеря не будет меньше или равно 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”