Skip to main content

Процесс создания модели в pytorch

image.png

  • Класс nn содержит все необходимое для создания нейросети
  • nn.Parameter - какие параметры может наша модель пробовать обучить, обычно слой PyTorch будет настраивать их
  • nn.Module - базовый класс нейросетей, все модели потомки этого класса. Должен содержать переопределенную процедуру forward
  • torch.optim - оптимизатор при создании модели
  • torch.inference_mode() - режим вывода при прогнозировании. Убирает очень много дополнительных данных

Приближение модели к нужным параметрам происходит с помощью фукции потерь (Loss function) Она показывает, насколько сильно полученные данные отличаются от требуемых.

Оптимизатор учитывает потери модели и корректирует параметры модели.

import torch
from torch import nn
import matplotlib.pyplot as plt

'''
Задача: сделаем данные на основе линейной регрессии (линейного уравнения). 
Обучим модель и попытаемся предсказать значения.
'''

def plot_data(train_data=[], train_labels=[],
              test_data=[], test_labels=[],
              prediction=None):
    plt.figure(figsize=(10, 7))
    plt.scatter(train_data, train_labels, c='b', s=4)
    plt.scatter(test_data, test_labels, c='g', s=4)
    if prediction is not None:
        plt.scatter(test_data, prediction, c='r', s=4)

    plt.show()

class LinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(1, 
                                               requires_grad=True,
                                               dtype=torch.float))
        self.bias = nn.Parameter(torch.randn (1,
                                            requires_grad=True,
                                            dtype=torch.float))
    
    def forward(self, x: torch.Tensor) -> torch.Tensor:
        return self.weights * x + self.bias


weight = 0.7
bias = 0.3 

# стартовый набор данных
start = 0
end = 1
step = 0.02

X = torch.arange(start, end, step).unsqueeze(dim=1)
Y = weight * X + bias

# Разделим данные на обучающие 60%-80%, тестовые 20%
train_size = int(0.8 * len(X)) 
X_train, Y_train = X[:train_size], Y[:train_size]
X_test, Y_test = X[train_size:], Y[train_size:]



torch.manual_seed(42)
model_0 = LinearRegressionModel()
print(list(model_0.parameters()))

# делаем предсказание о качестве метки
with torch.inference_mode():
    y_preds = model_0(X_test)

# Рисуем тестовые данные
plot_data(X_train, Y_train, X_test, Y_test, y_preds)

Ускорение работы прогнозирования