Level 5: CNN & 이미지 처리
🖼️

Level 5

전이 학습

Pre-trained 모델, Fine-tuning

50분
전이 학습 강의 영상
강의 영상 보기 (새 탭에서 재생)YouTube

📓Google Colab에서 실습하기

이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.

학습 내용

전이 학습

학습 목표

이 레슨을 완료하면:

  • 전이 학습의 개념과 이점을 이해합니다
  • 사전 훈련된 모델을 로드하고 사용합니다
  • 특성 추출(Feature Extraction)과 미세 조정(Fine-tuning)의 차이를 파악합니다
  • 실제 이미지 분류에 전이 학습을 적용합니다

핵심 메시지

"거인의 어깨 위에 서라." ImageNet에서 훈련된 모델은 이미 일반적인 이미지 특징(엣지, 텍스처, 패턴)을 학습했습니다. 이 지식을 재활용하면 적은 데이터로도 높은 성능을 얻을 수 있습니다.


1. 전이 학습이란?

비유: 피아노를 배운 사람이 신디사이저를 더 빨리 배우는 것과 같습니다. 기본적인 건반 연주 능력이 이미 있기 때문입니다. 전이 학습도 마찬가지로, 다른 문제에서 학습한 지식을 새로운 문제에 활용합니다.

전이 학습의 이점

이점설명
적은 데이터수백~수천 장으로도 가능
빠른 학습처음부터 학습하는 것보다 훨씬 빠름
높은 성능작은 데이터셋에서도 좋은 결과
컴퓨팅 절약GPU 시간 대폭 감소

2. 두 가지 접근 방식

특성 추출 (Feature Extraction)

사전 훈련된 층은 **동결(freeze)**하고, 새로운 분류기만 학습합니다.

레이어학습 여부
Conv 레이어들동결 (학습 X)
새 FC 레이어학습 O

사용 시점: 데이터가 매우 적거나, 원본 데이터셋과 비슷한 경우

미세 조정 (Fine-tuning)

전체 또는 일부 층을 작은 학습률로 추가 학습합니다.

레이어학습 여부
초기 Conv 레이어동결
후기 Conv 레이어학습 (작은 lr)
FC 레이어학습

사용 시점: 데이터가 충분하거나, 원본과 다른 도메인인 경우


3. PyTorch에서 사전 훈련 모델 사용

🔬 실습: ResNet 사전 훈련 모델 로드

python
⚠️ 로컬 실행 필요
import torch import torch.nn as nn from torchvision import models # ═══════════════════════════════════════════════════════════════ # 📊 사전 훈련된 ResNet18 로드 # ═══════════════════════════════════════════════════════════════ # 사전 훈련된 모델 로드 model = models.resnet18(weights='IMAGENET1K_V1') print("=" * 50) print("📊 ResNet18 구조") print("=" * 50) # 마지막 FC 레이어 확인 print(f"원래 FC 레이어: {model.fc}") print(f" 입력: 512, 출력: 1000 (ImageNet 클래스)") # 새로운 분류기로 교체 (예: 10 클래스) num_classes = 10 model.fc = nn.Linear(512, num_classes) print(f"\n새 FC 레이어: {model.fc}") print(f" 입력: 512, 출력: {num_classes}") # 파라미터 수 total = sum(p.numel() for p in model.parameters()) trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) print(f"\n총 파라미터: {total:,}") print(f"학습 가능: {trainable:,}")

4. 특성 추출 구현

🔬 실습: 층 동결하기

python
⚠️ 로컬 실행 필요
import torch import torch.nn as nn from torchvision import models # ═══════════════════════════════════════════════════════════════ # 📊 특성 추출: Conv 층 동결 # ═══════════════════════════════════════════════════════════════ model = models.resnet18(weights='IMAGENET1K_V1') # 모든 파라미터 동결 for param in model.parameters(): param.requires_grad = False # 새 분류기 추가 (이 레이어만 학습됨) model.fc = nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, 10) ) print("=" * 50) print("📊 특성 추출 모드") print("=" * 50) # 학습 가능한 파라미터 확인 total = sum(p.numel() for p in model.parameters()) trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) print(f"총 파라미터: {total:,}") print(f"학습 가능: {trainable:,} ({100*trainable/total:.1f}%)") # 어떤 레이어가 학습되는지 확인 print("\n학습되는 레이어:") for name, param in model.named_parameters(): if param.requires_grad: print(f" {name}: {param.shape}")

5. 미세 조정 구현

🔬 실습: 일부 층 해동하기

python
⚠️ 로컬 실행 필요
import torch import torch.nn as nn from torchvision import models # ═══════════════════════════════════════════════════════════════ # 📊 미세 조정: 일부 층 해동 # ═══════════════════════════════════════════════════════════════ model = models.resnet18(weights='IMAGENET1K_V1') # 먼저 모두 동결 for param in model.parameters(): param.requires_grad = False # layer4와 fc만 해동 (미세 조정) for param in model.layer4.parameters(): param.requires_grad = True # 새 분류기 model.fc = nn.Linear(512, 10) print("=" * 50) print("📊 미세 조정 모드") print("=" * 50) total = sum(p.numel() for p in model.parameters()) trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) print(f"총 파라미터: {total:,}") print(f"학습 가능: {trainable:,} ({100*trainable/total:.1f}%)") # 레이어별 학습률 설정 (미세 조정 시 중요!) optimizer = torch.optim.Adam([ {'params': model.layer4.parameters(), 'lr': 1e-4}, # 작은 학습률 {'params': model.fc.parameters(), 'lr': 1e-3} # 일반 학습률 ]) print("\n레이어별 학습률:") print(" layer4: 0.0001 (작은 학습률)") print(" fc: 0.001 (일반 학습률)")

6. 실전 전이 학습 예제

🔬 실습: CIFAR-10에 전이 학습 적용

python
⚠️ 로컬 실행 필요
import torch import torch.nn as nn import torch.optim as optim from torchvision import models, datasets, transforms from torch.utils.data import DataLoader # ═══════════════════════════════════════════════════════════════ # 📊 CIFAR-10에 전이 학습 적용 # ═══════════════════════════════════════════════════════════════ device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 데이터 준비 (ImageNet 정규화 사용) transform = transforms.Compose([ transforms.Resize(224), # ResNet 입력 크기 transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) train_data = datasets.CIFAR10('./data', train=True, download=True, transform=transform) test_data = datasets.CIFAR10('./data', train=False, transform=transform) # 작은 서브셋 사용 (전이 학습의 장점 보여주기) train_subset = torch.utils.data.Subset(train_data, range(5000)) # 5000개만 train_loader = DataLoader(train_subset, batch_size=32, shuffle=True) test_loader = DataLoader(test_data, batch_size=100) # 모델 준비 (특성 추출) model = models.resnet18(weights='IMAGENET1K_V1') for param in model.parameters(): param.requires_grad = False model.fc = nn.Linear(512, 10) model = model.to(device) # 학습 설정 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.fc.parameters(), lr=0.001) print("=" * 50) print("📊 전이 학습 (특성 추출)") print("=" * 50) print(f"훈련 데이터: {len(train_subset)}개 (전체의 10%)") print(f"디바이스: {device}") # 학습 epochs = 5 for epoch in range(1, epochs + 1): model.train() for data, target in train_loader: data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() # 평가 model.eval() correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) correct += model(data).argmax(1).eq(target).sum().item() acc = 100. * correct / len(test_data) print(f"Epoch {epoch}/{epochs} | Test Acc: {acc:.2f}%") print("\n💡 10%의 데이터만으로도 좋은 성능을 얻었습니다!")

핵심 요약

방법동결 층학습 층사용 시점
특성 추출Conv 전체FC만데이터 적음
미세 조정초기 Conv후기 Conv + FC데이터 많음

학습 체크리스트

  • 전이 학습의 이점을 설명할 수 있다
  • 특성 추출과 미세 조정의 차이를 안다
  • requires_grad로 층을 동결할 수 있다
  • 레이어별 다른 학습률을 설정할 수 있다

다음 강의 예고

"데이터 증강" - 적은 데이터를 효과적으로 늘리는 다양한 기법을 배웁니다!

레슨 정보

레벨
Level 5: CNN & 이미지 처리
예상 소요 시간
50분
참고 영상
YouTube 링크

💡실습 환경 안내

이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.

Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.