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

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

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

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

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

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

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

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

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

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

bash
pip install torch torchvision matplotlib

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

python
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: Подготовка данных

python
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.

python
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: Объявим модель, функцию потерь и оптимизатор

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

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

python
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: Проверим точность на тестовой выборке

python
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.

📎 Заключение

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

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

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