[파이썬] PyTorch로 신경망 구축하기

PyTorch는 딥러닝을 위한 오픈소스 머신 러닝 라이브러리입니다. 이미지 분류, 자연어 처리, 객체 감지 등 다양한 작업에 사용됩니다. 이번 포스트에서는 PyTorch를 사용하여 간단한 신경망을 구축하는 방법에 대해 알아보겠습니다.

1. PyTorch 설치하기

PyTorch를 사용하기 위해서는 먼저 PyTorch를 설치해야 합니다. 아래 명령어를 사용하여 pip를 통해 PyTorch를 설치할 수 있습니다.

pip install torch

2. 데이터 로드하기

데이터로부터 학습을 수행하기 위해서는 데이터를 불러와야 합니다. 예제로는 MNIST 데이터셋을 사용해보겠습니다. 아래 코드를 사용하면 MNIST 데이터셋을 다운로드하고 로드할 수 있습니다.

import torch
from torchvision import datasets, transforms

# 데이터를 받아올 때 사용할 변환 정의
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# MNIST 데이터셋 다운로드 및 로드
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)

# 데이터 로더 생성
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=True)

3. 신경망 구축하기

이제 신경망을 구축해보겠습니다. PyTorch에서는 torch.nn 모듈을 사용하여 신경망을 정의합니다.

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

class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)
        
    def forward(self, x):
        x = x.view(x.shape[0], -1) # Flatten the input tensor
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 신경망 인스턴스 생성
net = SimpleNet()

위 코드에서는 nn.Linear를 사용하여 fully connected layer를 정의하고, F.relu를 통해 활성화 함수를 적용합니다. 마지막 출력은 10개의 클래스에 대한 로짓을 반환합니다.

4. 모델 학습하기

이제 신경망을 학습시켜보겠습니다. 학습을 위해 손실 함수와 최적화 알고리즘을 정의해야 합니다.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 학습 반복
for epoch in range(5):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad() # 그라디언트 초기화
        
        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
        if i % 100 == 99:    # 매 100 미니배치마다 손실 출력
            print('Epoch %d, Mini-batches %5d, Loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

위 코드에서는 Cross Entropy Loss를 사용하여 손실을 계산하고, SGD(Stochastic Gradient Descent)를 사용하여 최적화를 수행합니다. 학습 반복문에서 데이터를 받아와 신경망에 전달한 후, 손실을 계산하고 역전파를 수행하여 매개변수를 업데이트합니다.

5. 모델 평가하기

마지막으로 학습한 모델을 평가해보겠습니다. 테스트 데이터셋을 사용하여 정확도를 계산합니다.

correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        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: %.2f %%' % (100 * correct / total))

위 코드에서는 테스트 데이터를 사용하여 추론을 수행한 후, 정확도를 계산합니다.

이제 PyTorch를 사용하여 신경망을 구축하는 방법을 알게되었습니다. 이를 통해 다양한 문제에 대한 신경망을 자유롭게 구축하고 학습시킬 수 있습니다. PyTorch는 높은 유연성과 사용자 친화적인 인터페이스로 인해 인기 있는 딥러닝 프레임워크 중 하나입니다.