[python] 파이썬 PyTorch에서 모델을 학습시키는 방법은?

PyTorch는 파이썬 기반의 딥 러닝 프레임워크로, 딥 러닝 모델을 효과적으로 학습할 수 있는 많은 기능을 제공합니다. 이번 블로그 포스트에서는 PyTorch를 사용하여 모델을 학습하는 방법에 대해 알아보겠습니다.

데이터셋 준비하기

먼저, 학습에 사용할 데이터셋을 준비해야 합니다. PyTorch에서는 torch.utils.data.Dataset 클래스를 사용하여 데이터셋을 생성할 수 있습니다. 예를 들어, CIFAR-10 데이터셋을 사용한다면 다음과 같이 데이터셋 클래스를 정의할 수 있습니다.

import torch
from torch.utils.data import Dataset

class CustomDataset(Dataset):
    def __init__(self):
        # 데이터셋 초기화 작업 수행
        self.data = torch.tensor(...)  # 데이터 로드
        self.targets = torch.tensor(...)  # 레이블 로드

    def __len__(self):
        # 데이터셋의 총 샘플 수 반환
        return len(self.data)

    def __getitem__(self, idx):
        # 주어진 인덱스에 해당하는 샘플과 레이블 반환
        return self.data[idx], self.targets[idx]

모델 정의하기

다음으로, 학습할 모델을 정의해야 합니다. PyTorch의 nn.Module 클래스를 확장하여 모델 클래스를 만들 수 있습니다. 예를 들어, 간단한 합성곱 신경망(CNN) 모델을 정의한다면 다음과 같이 할 수 있습니다.

import torch
import torch.nn as nn

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size)
        self.relu = nn.ReLU()
        self.fc = nn.Linear(in_features, out_features)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.fc(x)
        return x

학습 루프 구성하기

이제 모델을 학습시키기 위한 학습 루프를 구성해야 합니다. 학습 루프는 데이터셋에서 미니배치를 가져와 모델에 입력으로 제공하고, 출력과 목표 값 간의 오차를 계산하여 모델을 업데이트합니다. 아래는 간단한 학습 루프의 예입니다.

import torch
import torch.optim as optim
import torch.nn as nn

# 모델과 데이터셋 초기화
model = CNN()
dataset = CustomDataset()

# 손실 함수와 옵티마이저 설정
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 학습 루프
for epoch in range(num_epochs):
    running_loss = 0.0

    for inputs, labels in dataloader:
        # 경사 초기화
        optimizer.zero_grad()

        # 순전파
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # 역전파 및 가중치 업데이트
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    # 에폭마다 손실 출력
    print(f"Epoch {epoch + 1} Loss: {running_loss / len(dataset)}")

모델 평가하기

마지막으로, 학습된 모델을 평가할 수 있습니다. 이를 위해 테스트 데이터셋을 사용하고, 모델의 출력과 실제 값 간의 일치도를 계산합니다. 예를 들어, 정확도(Accuracy)를 계산하는 방법은 다음과 같습니다.

correct = 0
total = 0

with torch.no_grad():
    for inputs, labels in test_dataloader:
        outputs = model(inputs)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

accuracy = correct / total
print(f"Accuracy: {accuracy}")

결론

이렇게 PyTorch를 사용하여 모델을 학습할 수 있습니다. 데이터셋을 준비하고, 모델을 정의하고, 학습 루프를 구성한 뒤 모델을 평가하는 방법을 살펴보았습니다. PyTorch는 유연하고 강력한 딥 러닝 프레임워크이며, 이를 통해 다양한 모델을 학습시킬 수 있습니다.

참고 자료