Нейросети: создание и оптимизация будущего - страница 13

Шрифт
Интервал


Процесс обратного распространения заключается в том, чтобы передать эту ошибку обратно через сеть, корректируя веса каждого нейрона, чтобы в следующий раз ошибка была меньше. Это делается постепенно, слой за слоем, начиная с последнего (выходного) слоя и продвигаясь к входному. Цель этого процесса – минимизировать суммарную ошибку сети, заставляя её «учиться» лучше соответствовать эталонным данным.

Для понимания процесса обратного распространения ошибки и обучения сети создадим простую нейронную сеть с использованием библиотеки PyTorch. Эта сеть будет решать задачу бинарной классификации, предсказывая принадлежность к одному из двух классов.

Задача

Рассмотрим задачу, где мы классифицируем точки на плоскости в зависимости от их положения относительно заданной прямой. Наша цель – обучить нейронную сеть, которая сможет определить, в какой из двух классов (0 или 1) попадает каждая точка.

Решение с использованием обратного распространения и процесса обучения

В этом примере:

1. Мы создаем простую сеть с двумя полносвязными слоями.

2. Определяем функцию ошибки (Binary Cross Entropy).

3. Используем метод обратного распространения для корректировки весов сети на каждом этапе обучения.

Код решения

```python

import torch

import torch.nn as nn

import torch.optim as optim

import numpy as np

import matplotlib.pyplot as plt

# Генерация данных

np.random.seed(0)

torch.manual_seed(0)

data_size = 100

X = np.random.rand(data_size, 2) * 2 – 1 # точки на плоскости от -1 до 1

Y = (X[:, 0] + X[:, 1] > 0).astype(int) # класс 1, если сумма координат > 0, иначе 0

# Преобразование в тензоры

X_tensor = torch.FloatTensor(X)

Y_tensor = torch.FloatTensor(Y).reshape(-1, 1)

# Определение нейронной сети

class SimpleNet(nn.Module):

def __init__(self):

super(SimpleNet, self).__init__()

self.fc1 = nn.Linear(2, 4) # первый полносвязный слой

self.fc2 = nn.Linear(4, 1) # выходной слой для предсказания класса

def forward(self, x):

x = torch.relu(self.fc1(x))

x = torch.sigmoid(self.fc2(x))

return x

# Инициализация сети, функции потерь и оптимизатора

model = SimpleNet()

criterion = nn.BCELoss() # Binary Cross Entropy Loss

optimizer = optim.SGD(model.parameters(), lr=0.1)

# Обучение

epochs = 1000

losses = []

for epoch in range(epochs):

# Прямой проход

outputs = model(X_tensor)

loss = criterion(outputs, Y_tensor)