[파이썬] PyTorch 모델 평가 및 검증 전략

PyTorch를 사용하여 딥러닝 모델을 개발하고 훈련시킨 후, 그 모델을 평가하고 검증해야합니다. 모델의 성능을 정확하게 평가하고 적절한 검증 전략을 사용하는 것은 모델의 일반화 능력을 파악하는 데 매우 중요합니다. 이 블로그에서는 PyTorch를 사용하여 모델을 평가하고 검증하는 몇 가지 전략을 알아보고자 합니다.

1. 데이터셋 분할 전략

모델의 성능을 평가하기 위해서는 데이터를 적절히 분할해야합니다. 일반적으로는 데이터셋을 훈련, 검증 및 테스트 세트로 나눕니다. 훈련 세트는 모델을 학습하는 데 사용되고, 검증 세트는 모델의 하이퍼파라미터 튜닝과 모델 선택에 사용됩니다. 마지막으로, 테스트 세트는 최종 모델의 성능을 최종적으로 평가하는 데 사용됩니다.

PyTorch에서는 torch.utils.data.Dataset을 사용하여 데이터셋을 생성하고, torch.utils.data.DataLoader를 사용하여 데이터를 로드할 수 있습니다. 데이터셋을 생성한 후에는 random_split 함수를 사용하여 데이터셋을 분할할 수 있습니다. 다음은 데이터셋을 분할하는 코드의 예입니다.

from torch.utils.data import random_split

dataset = CustomDataset()  # 사용자 정의 데이터셋 생성
train_size = int(0.8 * len(dataset))
val_size = int(0.1 * len(dataset))
test_size = len(dataset) - train_size - val_size
train_dataset, val_dataset, test_dataset = random_split(dataset, [train_size, val_size, test_size])

2. 모델 평가 지표

모델 평가에는 다양한 지표를 사용할 수 있습니다. 모델의 성능을 정량적으로 측정하기 위해 일반적으로 정확도, 정밀도, 재현율, F1 점수 등이 사용됩니다. 이러한 지표는 sklearn.metrics 또는 torchmetrics와 같은 라이브러리를 사용하여 계산할 수 있습니다. 이러한 평가 지표는 각 클래스에 대해 계산될 수도 있고, 전체 클래스에 대해 평균을 구할 수도 있습니다.

다음은 모델 평가에 자주 사용되는 평가 지표 중 하나인 정확도를 계산하는 코드의 예입니다.

from torchmetrics import Accuracy

y_true = [...]  # 실제 레이블
y_pred = [...]  # 예측 레이블

accuracy = Accuracy()
accuracy(y_pred, y_true)

3. 교차 검증

교차 검증은 데이터셋을 여러 개의 서브셋으로 나누어 모델을 훈련하고 검증하는 절차입니다. 교차 검증을 사용하면 유한한 크기의 데이터셋에서 모델의 일반화 능력을 더 정확하게 평가할 수 있습니다. PyTorch에서는 torch.utils.data.Dataset을 사용하여 교차 검증을 수행할 수 있습니다. 다음은 5-폴드 교차 검증을 수행하는 코드의 예입니다.

from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import StratifiedKFold

# 데이터셋 정의
class CustomDataset(Dataset):
    ...

# 데이터셋 로드
dataset = CustomDataset()
kfold = StratifiedKFold(n_splits=5, shuffle=True)

for train_indices, val_indices in kfold.split(dataset):
    train_dataset = torch.utils.data.Subset(dataset, train_indices)
    val_dataset = torch.utils.data.Subset(dataset, val_indices)
    
    train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)
    val_dataloader = DataLoader(val_dataset, batch_size=32, shuffle=False)

    # 모델 훈련 및 검증
    model = MyModel()
    ...

4. 모델 저장 및 로드

훈련된 모델을 저장하고 나중에 다시 로드하여 사용할 수 있습니다. 모델을 저장하는 가장 일반적인 방법은 torch.save 함수를 사용하여 모델의 상태 사전(state dictionary)을 저장하는 것입니다. 저장된 모델은 torch.load 함수를 사용하여 로드할 수 있습니다.

# 모델 저장
torch.save(model.state_dict(), 'model.pth')

# 모델 로드
model = MyModel()
model.load_state_dict(torch.load('model.pth'))

PyTorch 버전 1.6부터는 torch.save 함수를 사용하여 모델의 상태 사전뿐만 아니라 전체 모델을 저장할 수도 있습니다. 이렇게 하면 모델의 아키텍처와 모델 파라미터를 모두 저장할 수 있습니다.

# 모델 저장
torch.save(model, 'model.pth')

# 모델 로드
model = torch.load('model.pth')

이렇게 PyTorch를 사용하여 모델을 평가하고 검증하는 몇 가지 전략을 살펴보았습니다. 이러한 전략은 모델의 성능을 신뢰할 수 있게 평가하기 위해 필요합니다. 적절한 데이터셋 분할, 모델 평가 지표, 교차 검증 및 모델 저장 및 로드를 사용하여 모델의 일반화 능력을 평가하고 향상시킬 수 있습니다.