본문 바로가기
IT/Python

나만의 숫자 분류기 만들기: 파이토치(PyTorch) 예제

by bamcong 2025. 2. 28.

안녕하세요! 오늘은 파이토치(PyTorch)를 사용하여 나만의 숫자 분류기를 만드는 방법에 대해 자세히 알아보겠습니다. 이 포스팅에서는 숫자 데이터셋으로 가장 많이 사용되는 MNIST 데이터셋을 활용해 보겠습니다. MNIST 데이터셋은 28x28 픽셀의 손글씨 숫자 이미지로 이루어져 있으며, 총 60,000개의 학습 샘플과 10,000개의 테스트 샘플로 구성되어 있습니다.

 

1. 환경 설정

먼저, 파이토치를 설치해야 합니다. 아래의 명령어를 통해 파이토치를 설치할 수 있습니다.

pip install torch torchvision

또한, Jupyter Notebook을 사용하면 실시간으로 코드를 실행할 수 있어 편리합니다. 아래의 명령어로 Jupyter Notebook도 설치해 주세요.

pip install notebook

 

2. 데이터셋 로딩

MNIST 데이터셋은 torchvision에서 쉽게 로드할 수 있습니다. 아래의 코드를 통해 손글씨 숫자 데이터를 다운로드하고 로드해보겠습니다.


import torch
import torchvision.transforms as transforms
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader

# 데이터 변환
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])

# MNIST 데이터셋 로드
trainset = MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=64, shuffle=True)

testset = MNIST(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=64, shuffle=False)

 

3. 모델 정의

이제 신경망 모델을 정의해 보겠습니다. 간단한 Fully Connected Neural Network(FCNN)를 사용할 것입니다. 아래의 코드를 참고하여 구현해 주십시오.


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

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)  # 이미지를 1차원 배열로 변환
        x = F.relu(self.fc1(x))  # ReLU 활성화 함수 적용
        x = F.relu(self.fc2(x))
        x = self.fc3(x)           # 출력층
        return x

model = SimpleNN()

 

4. 손실 함수와 옵티마이저 설정

모델을 학습하기 위해 손실 함수와 옵티마이저를 설정해야 합니다. 여기서는 CrossEntropyLoss와 Adam 옵티마이저를 사용할 것입니다.


import torch.optim as optim

criterion = nn.CrossEntropyLoss()   # 손실 함수
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 옵티마이저

 

5. 모델 학습

이제 모델을 학습하는 단계입니다. 각 배치마다 손실을 계산하고 역전파를 통해 가중치를 업데이트합니다.


def train(model, trainloader, criterion, optimizer, epochs=5):
    for epoch in range(epochs):
        for images, labels in trainloader:
            optimizer.zero_grad()  # 이전 기울기 초기화
            outputs = model(images)  # 모델 예측
            loss = criterion(outputs, labels)  # 손실 계산
            loss.backward()  # 역전파
            optimizer.step()  # 가중치 업데이트

        print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item()}')

train(model, trainloader, criterion, optimizer)

 

6. 모델 평가

모델이 학습을 마친 후, 테스트 데이터셋을 통해 모델의 성능을 평가해 보겠습니다.


def evaluate(model, testloader):
    correct = 0
    total = 0
    with torch.no_grad():  # 그래디언트 계산을 하지 않음
        for images, labels in testloader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)  # 가장 높은 확률을 가진 숫자 예측
            total += labels.size(0)  # 총 샘플 수 증가
            correct += (predicted == labels).sum().item()  # 맞춘 숫자 수 증가

    accuracy = 100 * correct / total
    print(f'Accuracy: {accuracy:.2f}%')

evaluate(model, testloader)

 

결론

이상으로, 파이토치를 사용하여 나만의 숫자 분류기를 만드는 방법을 알아보았습니다. 또한, 모델을 학습하고 평가하는 과정도 경험해 보았습니다. 이는 간단한 예제이지만, 다양한 데이터셋과 복잡한 네트워크 구조를 활용하여 더욱 발전된 모델을 만들어 나갈 수 있습니다. 이제 여러분도 직접 손글씨로 숫자를 분류하는 모델을 만들어 보시길 바랍니다!

반응형