[python] 파이썬 PyTorch에서 학습 중에 검증 데이터로 모델의 성능을 평가하는 방법은?
  1. 검증 데이터 세트 준비: 학습 데이터와 별도로 검증 데이터 세트를 미리 준비해야 합니다. 주로 학습 데이터의 일부를 분리하여 검증 데이터로 사용하며, 훈련 과정에서 모델의 성능을 평가하기 위해 사용됩니다.

  2. 검증 함수 정의: 모델의 성능을 평가하기 위해 검증 함수를 정의합니다. 일반적으로는 정확도(Accuracy)나 손실(loss)과 같은 지표를 사용하여 모델의 예측 결과를 검증 데이터의 실제 값과 비교합니다.

import torch

def evaluate(model, data_loader, loss_fn):
    model.eval()
    total_loss = 0
    total_correct = 0
    with torch.no_grad():
        for batch_data, batch_labels in data_loader:
            batch_data = batch_data.to(device)
            batch_labels = batch_labels.to(device)
            batch_predictions = model(batch_data)
            loss = loss_fn(batch_predictions, batch_labels)
            total_loss += loss.item()
            _, predicted_labels = torch.max(batch_predictions, 1)
            total_correct += (predicted_labels == batch_labels).sum().item()
            
    avg_loss = total_loss / len(data_loader)
    accuracy = total_correct / len(data_loader.dataset)
    
    return avg_loss, accuracy

위의 예제 코드에서는 evaluate() 함수를 정의하였습니다. 이 함수는 모델, 데이터 로더, 손실 함수를 입력으로 받고, 검증 데이터에 대한 평균 손실과 정확도를 반환합니다. 모델을 평가할 때는 model.eval()을 호출하여 모델을 평가 모드로 전환해야 합니다. 또한 torch.no_grad() 블록 내에서 연산을 수행하여 역전파를 방지합니다.

  1. 학습 과정에서 검증 수행: 모델 학습 중에 일정한 간격으로 검증 데이터를 사용하여 모델의 성능을 평가합니다. 예를 들어, 학습 횟수(epochs)마다 검증 데이터에 대한 성능을 평가하여 기록할 수 있습니다.
for epoch in range(epochs):
    # 학습 코드 ...
    
    if (epoch + 1) % val_interval == 0:
        avg_loss, accuracy = evaluate(model, validation_data_loader, loss_fn)
        print(f"Epoch [{epoch + 1}/{epochs}], Val Loss: {avg_loss:.4f}, Val Accuracy: {accuracy:.2%}")

위의 예제 코드에서는 학습 과정 중 val_interval 만큼의 학습 횟수마다 evaluate() 함수를 호출하여 검증 데이터에 대한 성능을 평가합니다. 평가 결과인 평균 손실과 정확도를 출력하여 모델의 성능 변화를 확인할 수 있습니다.

이와 같은 방법으로 PyTorch에서 학습 중에 검증 데이터로 모델의 성능을 평가할 수 있습니다. 더 복잡한 평가 방법이 필요한 경우, 다양한 평가 지표를 사용하거나 데이터의 특성에 맞게 평가 함수를 수정할 수 있습니다.


참고 자료: