[파이썬] PyTorch 합성곱 신경망(CNN) 구축

PyTorch는 딥러닝 프레임워크 중 하나로, 이미지 처리와 컴퓨터 비전 분야에서 널리 사용됩니다. 이번 블로그 포스트에서는 PyTorch를 사용하여 합성곱 신경망(CNN)을 구축하는 방법에 대해 알아보겠습니다.

1. 필요한 라이브러리 설치

먼저, PyTorch를 설치해야 합니다. 이를 위해 아래의 명령어를 사용합니다.

pip install torch torchvision

2. 데이터셋 로딩

합성곱 신경망을 구축하기 위해 이미지 데이터셋을 로딩해야 합니다. PyTorch는 torchvision이라는 패키지를 통해 다양한 데이터셋을 제공합니다. 예를 들어, CIFAR-10 데이터셋을 사용해보겠습니다.

import torch
import torchvision
import torchvision.transforms as transforms

# 데이터셋 로딩
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

3. 신경망 모델 정의

이제 신경망 모델을 정의해야 합니다. PyTorch에서는 torch.nn 모듈을 사용하여 신경망을 구축합니다. 여기서는 간단한 CNN 모델을 만들어보겠습니다.

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.fc1 = nn.Linear(32 * 8 * 8, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 32 * 8 * 8)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

4. 손실 함수와 최적화 함수 정의

신경망을 학습시키기 위해 손실 함수와 최적화 함수를 정의해야 합니다. 여기서는 교차 엔트로피 손실 함수와 확률적 경사 하강법(SGD)을 사용해보겠습니다.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

5. 신경망 학습

이제 데이터셋과 신경망 모델, 손실 함수, 최적화 함수가 준비되었으므로, 신경망을 학습해보겠습니다.

for epoch in range(epochs):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

6. 모델 평가

학습이 완료되었으므로, 학습된 모델을 평가해보겠습니다.

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

결론

이번 블로그 포스트에서는 PyTorch를 사용하여 합성곱 신경망을 구축하는 방법에 대해 알아보았습니다. PyTorch는 강력한 딥러닝 프레임워크이며, 이미지 처리와 컴퓨터 비전 분야에서 널리 사용되는 도구입니다. 합성곱 신경망을 구축하여 이미지 분류 문제를 해결하는 방법을 다루었으며, 이를 통해 딥러닝에 대한 이해도를 높일 수 있었습니다.