Python for AI, Embedded/Deep Learning: PyTorch & AI Modeling

PyTorch 모델 평가 및 시각화 완벽 가이드: matplotlib부터 TensorBoard까지

임베디드 친구 2026. 5. 9. 19:03
728x90
반응형

1. 개요

PyTorch를 이용해 딥러닝 신경망 모델을 설계하고 학습시킨 후, 가장 중요한 단계는 모델의 성능을 객관적으로 평가하고 학습 과정을 시각화하는 것입니다. 이를 통해 모델이 데이터에 적절히 적합(Fit)되었는지, 혹은 과적합(Overfitting)이 발생하지 않았는지 판단할 수 있습니다.

본 포스팅에서는 PyTorch에서 제공하는 성능 평가 방법과 더불어, 대표적인 시각화 도구인 MatplotlibTensorBoard를 활용하여 학습 데이터를 효과적으로 분석하는 실무적인 방법을 소개합니다.

Generated by Gemini AI.


2. PyTorch 모델 평가 방법 및 지표

모델의 일반화 성능을 확인하기 위해 주로 다음과 같은 지표와 도구를 사용합니다.

  • 손실 함수(Loss Function): 학습 및 테스트 데이터의 손실 값을 비교하여 모델의 수렴 상태를 확인합니다.
  • 정확도(Accuracy): 분류 문제에서 모델이 얼마나 정확하게 예측했는지 측정하는 기본 지표입니다.
  • 혼동 행렬(Confusion Matrix): 클래스별 정답과 오답의 분포를 파악하여 모델의 약점을 분석합니다.
  • ROC-AUC 및 PR 곡선: 불균형 데이터셋이나 이진 분류 모델의 성능을 정밀하게 평가할 때 활용합니다.

2.1 손실 값 및 정확도 계산 실전 코드

모델 평가 시에는 test_loader를 사용하여 미니배치 단위로 연산을 수행합니다. 이때 가장 중요한 포인트는 평가 모드(model.eval()) 설정과 기울기 계산 비활성화(torch.no_grad())입니다.

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

# 1. 간단한 CNN 모델 정의
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(32 * 14 * 14, 10)

    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x

# 모델, 손실함수, 옵티마이저 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 데이터 로드 (MNIST 예제)
transform = transforms.Compose([transforms.ToTensor()])
test_dataset = datasets.MNIST(root="./data", train=False, transform=transform, download=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# 2. 모델 평가 함수
def evaluate_model(model, test_loader):
    # 중요: 모델을 평가 모드로 전환 (Dropout, Batch Normalization 등의 동작 변경)
    model.eval()  
    total_loss = 0.0
    correct = 0
    total = 0
    
    # 기울기 계산을 비활성화하여 메모리 절약 및 속도 향상
    with torch.no_grad():
        for images, labels in test_loader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            loss = criterion(outputs, labels)
            
            total_loss += loss.item()
            _, predicted = torch.max(outputs, 1)
            correct += (predicted == labels).sum().item()
            total += labels.size(0)
            
    avg_loss = total_loss / len(test_loader)
    accuracy = correct / total
    print(f"Test 결과 - 평균 손실: {avg_loss:.4f}, 정확도: {accuracy:.4f}")

evaluate_model(model, test_loader)

3. 학습 과정 시각화 기법

숫자로 된 지표보다 그래프를 이용한 시각화는 모델의 학습 경향(Trend)을 파악하는 데 훨씬 유리합니다.

3.1 Matplotlib을 이용한 손실 및 정확도 추이 분석

학습 과정에서 기록된 loss와 accuracy 데이터를 리스트로 저장한 뒤, 아래 함수를 통해 직관적인 그래프를 그릴 수 있습니다.

Python
 
import matplotlib.pyplot as plt

def plot_metrics(train_losses, test_losses, train_accuracies, test_accuracies):
    epochs = range(1, len(train_losses) + 1)
    
    plt.figure(figsize=(14, 6))
    
    # 1. Loss 그래프 (과적합 확인용)
    plt.subplot(1, 2, 1)
    plt.plot(epochs, train_losses, 'b-', label='Train Loss')
    plt.plot(epochs, test_losses, 'r--', label='Test Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.title('Training & Validation Loss')
    plt.legend()
    plt.grid(True)
    
    # 2. Accuracy 그래프 (성능 확인용)
    plt.subplot(1, 2, 2)
    plt.plot(epochs, train_accuracies, 'g-', label='Train Accuracy')
    plt.plot(epochs, test_accuracies, 'm--', label='Test Accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.title('Training & Validation Accuracy')
    plt.legend()
    plt.grid(True)
    
    plt.tight_layout()
    plt.show()

3.2 실시간 모니터링의 최강자: TensorBoard

규모가 큰 프로젝트나 실시간으로 학습 상태를 확인해야 할 때는 TensorBoard가 필수적입니다. PyTorch의 SummaryWriter를 활용하면 간단하게 로그를 기록할 수 있습니다.

Python
 
from torch.utils.tensorboard import SummaryWriter

# 로그를 저장할 경로 설정 (기본값: 'runs')
writer = SummaryWriter('runs/mnist_experiment_1')

def log_metrics(epoch, train_loss, test_loss, train_acc, test_acc):
    # TensorBoard에 스칼라 값 기록
    writer.add_scalar('Loss/Train', train_loss, epoch)
    writer.add_scalar('Loss/Test', test_loss, epoch)
    writer.add_scalar('Accuracy/Train', train_acc, epoch)
    writer.add_scalar('Accuracy/Test', test_acc, epoch)

# 학습 루프 내에서 사용 예시
# log_metrics(epoch, loss.item(), test_loss, acc, test_acc)

# 자원 해제
# writer.close()

[TensorBoard 실행 방법] 터미널(Terminal)에서 아래 명령어를 입력한 뒤, 웹 브라우저에서 http://localhost:6006에 접속하세요.

Bash
 
tensorboard --logdir=runs

4. 결론 및 요약

효과적인 AI 모델 개발은 단순히 코드를 돌리는 것에 그치지 않고, 결과를 어떻게 분석하고 시각화하느냐에 달려 있습니다.

  1. model.eval()과 torch.no_grad()를 사용하여 정확한 평가 환경을 구축하세요.
  2. Matplotlib은 가벼운 분석과 논문/보고서용 그래프 작성에 적합합니다.
  3. TensorBoard는 대규모 실험의 실시간 모니터링과 체계적인 로그 관리에 유리합니다.

이러한 도구들을 적극 활용하여 모델의 병목 지점을 찾고 최적의 성능을 끌어내 보시기 바랍니다.

반응형