Неделя 6: Введение в нейронные сети и PyTorch
1. Теоретическая часть
1.1. Основы нейронных сетей
Искусственный нейрон — математическая модель биологического нейрона:
Входы (x₁, x₂, ...): Признаки данных
Веса (w₁, w₂, ...): Параметры модели
Смещение (bias): Добавочный параметр
Функция активации (σ): Нелинейное преобразование (ReLU, Sigmoid, Tanh)
Формула выхода нейрона
𝑧=𝑤1𝑥1+𝑤2𝑥2+⋯+𝑤𝑛𝑥𝑛+𝑏z=w1x1+w2x2+⋯+wnxn+b𝑎=𝜎(𝑧)a=σ(z)
1.2. Архитектуры нейронных сетей
Полносвязные сети (Dense/FC): Каждый нейрон связан со всеми нейронами следующего слоя.
Глубокие сети: Много скрытых слоев → возможность выявления сложных закономерностей.
Типы слоев
Слой
Назначение
Dense
Полносвязный слой
Dropout
Регуляризация (отключает часть нейронов)
BatchNorm
Нормализация активаций
1.3. Функции активации
Функция
Формула
Применение
ReLU
max(0,𝑥)max(0,x)
Скрытые слои
Sigmoid
11+𝑒−𝑥1+e−x1
Выходной слой (бинарная классификация)
Softmax
𝑒𝑥𝑖∑𝑒𝑥𝑗∑exjexi
Выходной слой (многоклассовая классификация)
2.1. Реализация нейронной сети на PyTorch
python
Copy
import torch
import torch.nn as nn
import torch.optim as optim
# Определение архитектуры сети
class NeuralNetwork(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(NeuralNetwork, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
# Инициализация модели
model = NeuralNetwork(input_size=784, hidden_size=128, num_classes=10)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
2.2. Обучение сети на MNIST
python
Copy
from torchvision import datasets, transforms
# Загрузка данных
transform = transforms.Compose([transforms.ToTensor()])
train_data = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(dataset=train_data, batch_size=64, shuffle=True)
# Цикл обучения
for epoch in range(10):
for images, labels in train_loader:
images = images.reshape(-1, 28*28)
# Forward pass
outputs = model(images)
loss = criterion(outputs, labels)
# Backward pass
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')
2.3. Визуализация предсказаний
python
Copy
import matplotlib.pyplot as plt
# Тестирование на одном примере
with torch.no_grad():
image, label = test_data[0]
output = model(image.reshape(-1, 28*28))
_, predicted = torch.max(output.data, 1)
plt.imshow(image.squeeze(), cmap='gray')
plt.title(f'Predicted: {predicted.item()}, Actual: {label}')
plt.show()
3. Домашнее задание
Задача 1: Изменение архитектуры сети
1. Добавьте третий полносвязный слой в нейронную сеть.
2. Сравните точность на тестовом наборе MNIST до и после изменения.
Решение:
python
Copy
class ExtendedNN(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(ExtendedNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size//2)
self.fc3 = nn.Linear(hidden_size//2, num_classes)
self.relu = nn.ReLU()
def forward(self, x):
out = self.relu(self.fc1(x))
out = self.relu(self.fc2(out))
out = self.fc3(out)
return out
Задача 2: Влияние функций активации
1. Замените ReLU на Sigmoid/Tanh в скрытых слоях.
2. Проанализируйте, как это влияет на скорость обучения и точность.
Решение:
python
Copy
class SigmoidNN(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(SigmoidNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, num_classes)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
out = self.sigmoid(self.fc1(x))
out = self.fc2(out)
return out
Задача 3: Регуляризация Dropout
1. Добавьте Dropout-слой с вероятностью 0.5 после первого скрытого слоя.
2. Сравните результаты с оригинальной моделью (переобучение/недообучение).
Решение:
python
Copy
class DropoutNN(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(DropoutNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(hidden_size, num_classes)
self.relu = nn.ReLU()
def forward(self, x):
out = self.dropout(self.relu(self.fc1(x)))
out = self.fc2(out)
return out
Итоги недели
✅ Познакомились с основами нейронных сетей и PyTorch.
✅ Реализовали полносвязную сеть для классификации MNIST.
✅ Исследовали влияние архитектуры, функций активации и регуляризации.
✅ Научились визуализировать предсказания модели.
Следующая тема: Сверточные нейронные сети (CNN). 🖼️