Пример использования сверточной нейронной сети в PyTorch

Posted by


В этом уроке мы рассмотрим пример реализации сверточной нейронной сети с использованием библиотеки 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. При необходимости можно изменять архитектуру модели, параметры обучения и другие аспекты для улучшения производительности.

0 0 votes
Article Rating

Leave a Reply

3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@АсельАртыкбаева-и1в
2 hours ago

Благодарю вас!

@AnatoliyAndrakhanov
2 hours ago

Сергей, спасибо большое за замечательный курс по Pytorch! Курс по ML у Вас тоже очень классный – очень понятно, рассказывается просто и в тоже время, не поверхностно, а с хорошей достаточной глубиной, прямо то, что нужно! 🙂
Скажите, а по визуализации моделей (в т.ч. архитектур CNN) в PyTorch планируется что-то в курсе?

@AlexRootx
2 hours ago

Лайк в поддержку Сергея Балакирева!!! Перезалив?

3
0
Would love your thoughts, please comment.x
()
x