После теории пора перейти к делу. В этой статье мы шаг за шагом обучим простую нейросеть, которая сможет распознавать рукописные цифры от 0 до 9.
📦 Что за задача?
Мы будем работать с датасетом MNIST — это набор из 70 000 изображений цифр размером 28×28 пикселей:
60 000 — для обучения
10 000 — для тестирования
Каждое изображение — это массив чисел от 0 до 255, представляющих яркость пикселей.
🧰 Что нужно для начала?
Мы будем использовать Python и библиотеку PyTorch.
Если у тебя установлен Jupyter Notebook или Google Colab — идеально.
pip install torch torchvision matplotlib
🛠 Шаг 1: Импорт библиотек
import 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: Подготовка данных
transform = 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.
class 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: Объявим модель, функцию потерь и оптимизатор
model = Net()
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
🔁 Шаг 5: Обучаем модель
for 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: Проверим точность на тестовой выборке
correct = 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.
📎 Заключение
Теперь ты знаешь, как обучить свою первую нейросеть! Это базовая, но мощная отправная точка в мир глубокого обучения.
В следующей статье мы поговорим о типичных ошибках новичков: что часто идёт не так и как избежать разочарований при обучении моделей.








