딥러닝 파이토치 강좌, 딥러닝 알고리즘

소개

딥러닝은 인공지능 분야에서 급격히 발전하고 있는 기술입니다. 그 중에서도 파이토치(PyTorch)는
동적 계산 그래프를 특징으로 하여 연구자와 개발자들 사이에서 인기를 끌고 있습니다.
본 글에서는 딥러닝 알고리즘의 기본 개념, 파이토치의 특징, 실제 예제 코드를
통해 딥러닝 모델을 구현하는 방법을 상세하게 설명하겠습니다.

딥러닝의 기본 개념

딥러닝은 인공 신경망을 기반으로 한 기계학습의 한 분야로, 여러 층으로 구성된 신경망을
통해 데이터를 처리하고 학습합니다. 신경망의 각각의 층은 입력 데이터의 특징을 추출하고,
이를 바탕으로 최종적인 예측을 수행합니다.

신경망의 구조

신경망은 입력층, 은닉층, 출력층으로 구성됩니다.
입력층: 데이터를 입력받는 층입니다.
은닉층: 입력 데이터를 변형하고 특징을 추출하는 층입니다. 여러 개의 은닉층을 사용할 수 있습니다.
출력층: 예측 결과를 출력하는 층입니다.

활성화 함수

신경망의 각 뉴런에서 입력 신호를 처리하기 위해 활성화 함수가 사용됩니다.
대표적인 활성화 함수로는 ReLU(Rectified Linear Unit), Sigmoid, Tanh 등이 있습니다.

파이토치(PyTorch)

파이토치는 페이스북이 개발한 오픈소스 딥러닝 프레임워크로, 빠른 프로토타이핑과 동적 계산 그래프를
지원하여 유연한 모델 설계를 가능합니다. 사용자가 직관적으로 모델을 구축하고,
실험할 수 있도록 돕는 다양한 기능을 제공합니다.

파이토치의 주요 특징

  • 동적 계산 그래프: 계산 그래프를 실행 시점에 정의할 수 있어, 코드의 유연성과 가독성이 높습니다.
  • 자동 미분: Gradients를 자동으로 계산해 주어, 복잡한 수식을 쉽게 구현할 수 있습니다.
  • 강력한 GPU 지원: NVIDIA GPU를 통해 모델의 학습 속도를 크게 향상시킬 수 있습니다.

딥러닝 알고리즘 구현 예제

MNIST 데이터셋 소개

MNIST는 손글씨 숫자 데이터셋으로, 0부터 9까지의 숫자를 포함한 70,000개의 이미지로 구성되어 있습니다.
이 데이터셋은 딥러닝 모델을 평가하는 데 널리 사용됩니다.

파이토치로 MNIST 분류기 구현하기

이제 실질적으로 파이토치를 사용하여 MNIST 숫자 분류기를 구현해보겠습니다.

1. 필요한 라이브러리 임포트

python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
    

2. 데이터셋 로딩

MNIST 데이터셋을 다운로드하고, 데이터 변환을 통해 텐서로 변환합니다.

python
# 하이퍼파라미터 설정
batch_size = 64

# 데이터 변환
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))  # 평균과 표준편차로 정규화
])

# 데이터셋 로딩
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
    

3. 신경망 정의하기

기본적인 다층 퍼셉트론을 정의합니다.

python
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 입력층
        self.fc2 = nn.Linear(128, 64)        # 은닉층
        self.fc3 = nn.Linear(64, 10)         # 출력층

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 2D 텐서를 1D 텐서로 변환
        x = torch.relu(self.fc1(x))  # ReLU 활성화 함수 적용
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x
    

4. 모델 학습하기

학습을 위한 손실 함수와 최적화 사항을 설정하고, 모델을 학습합니다.

python
# 모델, 손실 함수, 최적화 알고리즘 정의
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 학습 루프
num_epochs = 5
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()  # 기울기 초기화
        outputs = model(images)  # 순전파
        loss = criterion(outputs, labels)  
        loss.backward()  # 역전파
        optimizer.step()  # 가중치 업데이트
        
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
    

5. 모델 평가하기

학습한 모델을 테스트 데이터셋으로 평가합니다.

python
# 모델 평가
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 of the model on the test images: {100 * correct / total:.2f}%')
    

결론

본 글에서는 파이토치를 사용하여 MNIST 손글씨 숫자 분류기를 구현하는 과정을 통해
딥러닝의 기본 개념과 알고리즘 이해를 도왔습니다.
파이토치는 사용이 간편하면서도 강력한 기능을 제공하므로, 다양한 딥러닝 프로젝트에 적합한
도구입니다. 지속적으로 파이토치의 다양한 기능과 최신 모델을 실험하여 딥러닝 기술을
더욱 발전시키시기 바랍니다.

참고 문헌