안녕하세요! 오늘은 파이토치(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)
결론
이상으로, 파이토치를 사용하여 나만의 숫자 분류기를 만드는 방법을 알아보았습니다. 또한, 모델을 학습하고 평가하는 과정도 경험해 보았습니다. 이는 간단한 예제이지만, 다양한 데이터셋과 복잡한 네트워크 구조를 활용하여 더욱 발전된 모델을 만들어 나갈 수 있습니다. 이제 여러분도 직접 손글씨로 숫자를 분류하는 모델을 만들어 보시길 바랍니다!
'IT > Python' 카테고리의 다른 글
클로드 AI API를 연결하는 간단한 파이썬 예제 (0) | 2025.03.02 |
---|---|
Python으로 LangChain으로 GPT와 연결하기 (0) | 2025.03.01 |
이진 분류 문제 실습: 파이토치(PyTorch) 예제 (0) | 2025.03.01 |
나만의 감성 분석 모델 만들기: 파이토치(PyTorch) 예제 (0) | 2025.03.01 |
파이썬 Falcon API 예제 및 설명 (0) | 2025.02.27 |