Линейная регрессия с использованием PyTorch

| | | | | | | | | | | | | | | | | | | |

Во-первых, вам необходимо установить PyTorch в вашей среде Python. Самый простой способ сделать это — используйте инструмент pip или conda . Посетите pytorch.org и установите нужную версию интерпретатора Python и диспетчера пакетов.


# Мы можем запустить этот код Python в блокноте Jupyter
# для автоматической установки правильной версии
# PyTorch.


# http://pytorch.org / from путь импорта ОС

from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag

платформа = `{} {} - {}` . format (get_abbr_impl(), get_impl_ver(), get_abi_tag())

ускоритель = `cu80` if path.exists ( `/ opt / bin / nvidia-smi` ) else `процессор`


! pip install - q http: / / download.pytorch.org / whl / {ускоритель} / факел - 0,3 . 0.post4 - {платформа} - linux_x86_64.whl torchvision

Установив PyTorch, давайте теперь посмотрите на код.
Напишите две строки ниже, чтобы импортировать необходимые библиотечные функции и объекты.


импорт факел

from torch.autograd import Переменная

Мы также определяем некоторые данные и присваиваем их переменным x_data и y_data, следующим образом:


x_data = Переменная (torch.Tensor ([[ 1.0 ], [ 2.0 ], [ 3.0 ]]))

y_data = Variable (torch.Tensor ([[ 2.0 ], [ 4.0 ], [ 6.0 ]]))

Здесь x_data & №8212; наша независимая переменная и y_data — наша зависимая переменная. Это будет наш набор данных на данный момент. Далее нам нужно определить нашу модель. Есть два основных шага, связанных с определением нашей модели. Вот они:

  1. Инициализация нашей модели.
  2. Объявление передачи вперед.

Мы используем следующий класс:

class LinearRegressionModel (torch.nn.Module):


def __ init __ ( self ):

super (LinearRegressionModel, self ) .__ init __ ()

self . linear = torch.nn.Linear( 1 , 1 ) # Один ввод и один выход


def forward ( self , x):

y_pred = self . linear (x)

return y_pred

Как видите, наш класс Model является подклассом torch.nn.module. Кроме того, поскольку здесь у нас есть только один вход и один выход, мы используем линейную модель с размером входа и выхода 1.

Далее мы создаем объект этой модели.

# наша модель

our_model = LinearRegressionModel ()

После этого выберите оптимизатор и критерии потерь. Здесь мы будем использовать среднеквадратичную ошибку (MSE) в качестве нашей функции потерь и стохастический градиентный спуск (SGD) в качестве нашего оптимизатора. Мы также произвольно устанавливаем скорость обучения на 0,01.


критерий = torch.nn.MSELoss (size_average = False )

оптимизатор = torch.optim.SGD(our_model.parameters(), lr = 0.01 )

Теперь мы подошли к этапу обучения. Во время обучения мы выполняем следующие задачи 500 раз:

  1. Выполняем передачу в реальном времени, передавая наши данные и вычисляя прогнозируемое значение y.
  2. Рассчитайте потери с помощью MSE.
  3. Сбросьте все градиенты до 0, выполните обратное распространение, а затем обновите веса.

для эпохи в диапазон ( 500 ):


# Прямой проход: вычисление предсказанного y путем передачи

#x к модели

pred_y = our_model (x_data)


# Вычислить и потерять печать

потеря = критерий (pred_y, y_data)


# Нулевые градиенты, возврат

# и обновить вес.

optimizer.zero_grad()

loss.backward()

optimizer.step()

печать ( ` эпоха {}, потеря {} ` . format (epoch, loss.data[ 0 ]))

После завершения обучения мы проверяем, получаем ли мы правильные результаты, используя модель, которую мы определили. Поэтому мы проверяем его на наличие неизвестного значения x_data, в данном случае 4.0.


new_var = Variable (torch.Tensor ([[[ 4.0 ] ]))

pred_y = our_model ( new_var)

print ( "прогнозировать (после обучения)" , 4 , our_model( new_var) .data [ 0 ] [ 0 ])

Если вы правильно выполнили все шаги, вы увидите, что для записи 4.0 вы получаете значение очень близко к 8,0, как показано ниже. Таким образом, наша модель изучает отношения между вводом и выводом без явного программирования.

предсказать (после обучения) 4 7,966438293457031

Для справки вы можете найти весь код для этой статьи ниже:


import torch

from torch.autograd import Переменная

x_data = Переменная (torch.Tensor ([[ 1.0 ], [ 2.0 ], [ 3.0 ]]))

y_data = <класс кода = "обычный"> V ariable(torch.Tensor([[ 2.0 ], [ 4.0 ], [ 6.0 ]]))



class LinearRegressionModel (torch.nn.Module):


def __ init __ ( self ):

super (LinearRegressionModel, self ) .__ init __ ()

self . linear = torch.nn.Linear ( 1 , 1 ) # Один ввод и один выход


def forward ( self , x):

y_pred = self . linear (x)

return y_pred


# наша модель

our_model = LinearRegressionModel ()

критерий = torch.nn.MSELoss (size_average = False )

оптимизатор = torch.optim. SGD (our_model.parameters(), lr = 0.01 )


for эпоха in диапазон ( 500 ):

# Прямой проход: вычисление предсказанного y путем передачи

# —… моделировать

pred_y = our_model (x_data)


# Расчет и потеря печати

loss = критерий (pred_y, y_data)


# Нулевые градиенты, обратный проход,

# и обновление веса.

optimizer.zero_grad ()

loss.backward ()

optimizer.step ()

print ( `эпоха {}, потеря {}` . формат (эпоха, loss.data [ 0 ]))


new_var = Переменная (torch.Tensor ([[ 4.0 ]]))

pred_y = our_model (new_var)

print ( "предсказать (после обучения)" , 4 , our_model (new_var) .data [ 0 ] [ 0 ])

Ссылки