В этом уроке мы рассмотрим пример реализации сверточной нейронной сети с использованием библиотеки PyTorch. Сверточные нейронные сети (Convolutional Neural Networks, CNN) являются основой многих современных приложений машинного обучения, особенно в области компьютерного зрения.
Для начала установим библиотеку PyTorch, если вы еще не сделали этого. Установка PyTorch осуществляется через pip:
pip install torch torchvision
После установки PyTorch мы можем начать реализацию сверточной нейронной сети. В качестве примера рассмотрим простую сверточную нейронную сеть для классификации изображений из набора данных CIFAR-10.
CIFAR-10 – это известный набор данных, содержащий 60 000 цветных изображений размером 32×32 пикселя, разделенных на 10 классов (например, автомобили, самолеты, собаки и т. д.).
Давайте начнем с определения архитектуры нашей сверточной нейронной сети. Мы создадим простую модель с несколькими сверточными слоями, слоями пулинга и полносвязными слоями.
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
# Определение архитектуры сверточной нейронной сети
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.relu(self.conv1(x))
x = self.pool(x)
x = self.relu(self.conv2(x))
x = self.pool(x)
x = x.view(-1, 32 * 8 * 8)
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
В нашей модели SimpleCNN
мы использовали два сверточных слоя с функцией активации ReLU, слои пулинга MaxPool и два полносвязных слоя.
После определения модели мы можем создать экземпляр этой модели, определить функцию потерь и оптимизатор для обучения:
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
Затем мы можем загрузить данные CIFAR-10, определить загрузчики данных для обучения и валидации и начать обучение модели:
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=False)
num_epochs = 10
for epoch in range(num_epochs):
model.train()
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item()}')
В этом коде мы переводим модель в режим обучения, проходим по обучающему набору данных и обновляем параметры модели с помощью оптимизатора.
После завершения обучения мы можем оценить производительность обученной модели на тестовом наборе данных:
model.eval()
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy on test set: {100 * correct / total}%')
Это пример реализации сверточной нейронной сети на PyTorch для классификации изображений с использованием набора данных CIFAR-10. При необходимости можно изменять архитектуру модели, параметры обучения и другие аспекты для улучшения производительности.
Благодарю вас!
Сергей, спасибо большое за замечательный курс по Pytorch! Курс по ML у Вас тоже очень классный – очень понятно, рассказывается просто и в тоже время, не поверхностно, а с хорошей достаточной глубиной, прямо то, что нужно! 🙂
Скажите, а по визуализации моделей (в т.ч. архитектур CNN) в PyTorch планируется что-то в курсе?
Лайк в поддержку Сергея Балакирева!!! Перезалив?