딥러닝 파이토치 강좌, 전이 학습

1. 서론

전이 학습(Transfer Learning)은 머신러닝 및 딥러닝 분야에서 매우 중요한 기술입니다. 이 기술은 한 작업에 대해 학습한 가중치나 파라미터를 다른 유사한 작업에 재사용하는 과정을 말합니다. 전이 학습을 통해 샘플의 수가 적거나, 새로운 데이터셋을 사용할 때 많은 시간과 자원을 절약할 수 있습니다.

2. 전이 학습의 필요성

데이터 수집 및 모델 학습에는 많은 시간과 비용이 필요합니다. 따라서 이미 존재하는 모델에서 학습한 지식을 새로운 작업에 활용함으로써 효율성을 높일 수 있습니다. 예를 들어, 이미지 분류를 위한 모델이 이미 학습된 경우, 이러한 모델을 식물 분류와 같은 유사한 작업에 활용할 수 있습니다.

3. 전이 학습의 개념

일반적으로 전이 학습은 다음과 같은 단계를 포함합니다:

  • 사전 훈련된 모델 선택
  • 기존 모델의 일부 또는 전체 가중치 불러오기
  • 새로운 데이터에 맞게 모델의 일부를 다시 훈련시키기 (fine-tuning)

4. 파이토치에서의 전이 학습

파이토치는 전이 학습을 지원하는 다양한 기능을 제공합니다. 이를 통해 복잡한 모델을 쉽게 사용할 수 있습니다. 아래의 예제에서는 파이토치의 torchvision 라이브러리를 이용해 사전 훈련된 모델로 이미지 분류 작업을 수행하는 과정을 설명하겠습니다.

4.1 데이터셋 준비

이미지 데이터셋을 로딩하고 전처리하는 방법을 설명합니다. 여기서는 CIFAR-10 데이터셋을 사용하겠습니다.


import torch
import torchvision
import torchvision.transforms as transforms

# 데이터 전처리
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])

# CIFAR-10 데이터셋 로드
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                         shuffle=False, num_workers=2)
    

4.2 사전 훈련된 모델 로드

파이토치의 torchvision 모델에서 사전 훈련된 ResNet18 모델을 불러오는 방법을 설명합니다.


import torchvision.models as models

# 사전 훈련된 모델 로드
model = models.resnet18(pretrained=True)

# 마지막 레이어 수정
num_classes = 10  # CIFAR-10의 클래스 수
model.fc = torch.nn.Linear(model.fc.in_features, num_classes)
    

4.3 손실 함수 및 최적화기 정의

다중 클래스 분류 문제를 위해 손실 함수와 최적화 알고리즘을 정의합니다.


import torch.optim as optim

criterion = torch.nn.CrossEntropyLoss()  # 손실 함수
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)  # 최적화 알고리즘
    

4.4 모델 훈련

모델을 훈련시키기 위한 전체적인 코드와 방법을 설명합니다.


# 모델 훈련
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

for epoch in range(10):  # 에포크 수 조정 가능
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)

        # 경량화 경과
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:    # 매 100 미니 배치마다 출력
            print(f'[Epoch {epoch + 1}, Batch {i + 1}] loss: {running_loss / 100:.3f}')
            running_loss = 0.0

print('Finished Training')
    

4.5 모델 평가

훈련이 완료된 모델을 평가하는 방법에 대해 설명합니다. 테스트 데이터셋을 사용하여 모델의 정확도를 측정합니다.


# 모델 평가
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')
    

5. 결론

본 강좌에서는 딥러닝에서 전이 학습의 개념과 파이토치를 이용한 구현 방법을 살펴보았습니다. 전이 학습은 데이터가 부족한 상황에서도 강력한 성능을 낼 수 있도록 돕는 중요한 기술입니다. 다양한 사전 훈련된 모델을 활용하여 우리는 보다 쉽게 고성능 모델을 개발할 수 있습니다. 앞으로도 이러한 전이 학습을 통해 더 많은 딥러닝 어플리케이션이 개발되기를 기대합니다.

6. 참고 자료