Практика — обучаем простую нейросеть

Практика — обучаем простую нейросеть Нейросети для начинающих

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

📦 Что за задача?

Мы будем работать с датасетом MNIST — это набор из 70 000 изображений цифр размером 28×28 пикселей:

  • 60 000 — для обучения

  • 10 000 — для тестирования

Каждое изображение — это массив чисел от 0 до 255, представляющих яркость пикселей.

🧰 Что нужно для начала?

Мы будем использовать Python и библиотеку PyTorch.
Если у тебя установлен Jupyter Notebook или Google Colab — идеально.

bashpip install torch torchvision matplotlib

🛠 Шаг 1: Импорт библиотек

pythonimport torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import datasets, transforms
import matplotlib.pyplot as plt

🖼 Шаг 2: Подготовка данных

pythontransform = transforms.ToTensor()
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=False)

🧠 Шаг 3: Определяем модель

Наша сеть будет очень простой: вход → скрытый слой → ReLU → выходной слой → softmax.

pythonclass Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 28*28) # расплющиваем изображение
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x

⚙️ Шаг 4: Объявим модель, функцию потерь и оптимизатор

pythonmodel = Net()
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

🔁 Шаг 5: Обучаем модель

pythonfor epoch in range(5): # 5 эпох
for batch in train_loader:
images, labels = batch
preds = model(images)
loss = loss_fn(preds, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1} — Loss: {loss.item():.4f}")

✅ Шаг 6: Проверим точность на тестовой выборке

pythoncorrect = 0
total = 0
model.eval() # режим оценки
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f"Accuracy: {accuracy:.2f}%")

🧠 Что мы сделали?

  • Загрузили и преобразовали данные MNIST.

  • Построили простую нейросеть с одним скрытым слоем.

  • Обучили модель на тренировочных данных.

  • Проверили её точность на тестовой выборке.

Несмотря на простоту, такая сеть может достигать точности ~96% — неплохо для первого раза!

💡 Что можно улучшить?

  • Добавить больше скрытых слоёв (глубже сеть).

  • Использовать свёрточную нейросеть (CNN).

  • Добавить регуляризацию и нормализацию.

  • Обучать больше эпох и подбирать learning rate.

📎 Заключение

Теперь ты знаешь, как обучить свою первую нейросеть! Это базовая, но мощная отправная точка в мир глубокого обучения.

В следующей статье мы поговорим о типичных ошибках новичков: что часто идёт не так и как избежать разочарований при обучении моделей.


ЧИТАТЬ ДАЛЬШЕ

Вадим
Оцените автора
NeuroДоход