260319 [ Day 50 ] - ML, DL - Part 2 (9)

TaeHyun·2026년 3월 19일

TIL

목록 보기
176/185

시작하며

오늘은 ResNet 모델에 대해서 배웠다. 분명 전에 다뤄본 모델이었는데 이름만 익숙했지 사용법은 전혀 달라서 놀랐다.

전이학습 : ResNet-18

전이학습

  • 대규모 데이터셋으로 미리 학습된 모델을 가져와 특징을 재사용하고, 새로운 데이터에 맞게 일부만 조정하는 방법
    • 사전 학습 된 모델 준비
    • 준비한 데이터셋에 적용하여 예측 수행
    • 모델 성능 확인 및 일부 조정하여 개선

사전 학습 모델

  • 대규모 이미지 데이터를 사용하여 이미 학습이 완료된 딥러닝 모델
    • 대규모 이미지 데이터로 학습된 모델은 작은 데이터셋에도 비교적 안정적인 성능을 보임
    • 기본적인 시각적 특징을 이미 학습한 상태
    • 새로운 문제에 대해서도 특징 추출기로서 효과적으로 활용

사전 학습 모델의 구조

  • 사전 학습 모델은 합성곱 신경망 백본과 분류기로 구성
    • 백본 : 이미지의 기본적인 시각적 특징을 추출
    • 분류기 : 문제에 맞게 최종 클래스를 판단하는 역할
  • 이러한 구조로 인해 백본은 그대로 유지하고 분류기만 교체하여 새로운 문제에 적용

사전 학습 모델에서 자주 쓰는 합성곱 신경망 백본

모델명상세 내용
ResNet• 매우 깊은 신경망에서도 학습이 가능하도록 잔차 연결(skip connection)을 사용
• ImageNet 사전 학습 모델로 가장 널리 사용
• 전이학습 실습에서 사실상 표준 선택지
VGGNet• 단순하고 직관적인 구조를 가진 합성곱 신경망 모델
• 구조 이해는 좋지만 파라미터 수가 많아 최근 실무에서의 적용이 줄어들었음
DenseNet• 모든 층을 촘촘하게 연결하여 특징 재사용을 극대화한 구조
• 메모리 효율은 좋지만 구조 설명이 복잡함
EfficientNet• 모델의 깊이, 너비, 입력 해상도를 균형 있게 확장해 적은 파라미터로 높은 성능을 보임
• 정확도 대비 연산 효율이 좋아 경량 모델이나 실무 환경에서 자주 사용

ResNet 모델의 구조

  • 기존 신경망은 깊어질수록 기울기를 소실할 가능성이 큼
  • ResNet은 입력을 출력에 직접 더하는 잔차 연결을 하여 기울기 소실을 방지

전이학습 활용 방식

구분특징 추출 (Feature Extraction)미세 조정 (Fine-tuning)
가중치 활용사전 학습 모델의 가중치를 그대로 유지(동결)사전 학습 모델의 일부 또는 전체 가중치를 함께 학습
학습 범위분류기(마지막 층)만 새로 구성하여 학습새로운 데이터의 특성에 맞춰 모델을 조금씩 다시 학습시켜 적응
적합한 상황데이터가 적거나 빠른 적용이 필요한 경우에 적합데이터가 충분하거나 더 높은 성능이 필요한 경우에 사용

전이학습 모델 생성

from torchvision import models
import torch.nn as nn
  • 사전 학습 모델 가중치 생성
weights = models.ResNet18_Weights.DEFAULT
  • 사전 학습 모델의 가중치를 적용한 전이학습 모델 생성
model = models.resnet18(weights=weights)

  • 모델의 마지막 합성곱 층 확인
model.layer4[-1].conv2
# Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  • 학습 가능한 파라미터 수 확인
sum(p.numel() for p in model.parameters() if p.requires_grad)
# 11689512

백본 가중치 고정 및 마지막 분류기 교체

  • 전이학습 모델의 백본 가중치를 모두 고정
    • 가중치가 업데이트(역전파)되지 않도록 설정
for p in model.parameters():
    p.requires_grad = False
  • 학습 가능한 파라미터 수 확인
sum(p.numel() for p in model.parameters() if p.requires_grad)
# 0
  • 모델의 분류기를 CIFAR-10 에 맞게 교체
model.fc = nn.Linear(in_features=model.fc.in_features, out_features=10, bias=True)
  • 손실함수 및 최적화 알고리즘 생성
    • 마지막 분류기 파라미터만 업데이트되니 model.fc.parameters() 지정
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(params=model.fc.parameters(), lr=0.001)
  • 학습 객체 생성 후 학습
trainer = Trainer(
    model=model,
    criterion=criterion,
    optimizer=optimizer,
    train_loader=train_loader,
    test_loader=test_loader,
    flatten=False,
    device=device
)
history = trainer.fit(10)

미세 조정

  • 전이 학습 모델의 네 번째 레이어를 학습 가능하도록 전환
for p in model.layer4.parameters():
    p.requires_grad = True  
  • 학습 가능한 파라미터 할당
params_fine_tuning = filter(lambda p: p.requires_grad, model.parameters())
  • 최적화 알고리즘 다시 생성
    • 미세 조정은 특징 추출 때보다 한 단계 낮게 설정하는 것이 일반적
    • 사전 학습으로 이미 얻는 정보를 잃어버릴 수 있어 조심스럽게 접근하기 위함
optimizer = torch.optim.Adam(params=params_fine_tuning, lr=0.0001)
  • 최적화 알고리즘 다시 적용
trainer.optimizer = optimizer
  • 에포크 5회 동안 학습
    • 미세 조정은 에포크를 5회로 짧게 설정
history = trainer.fit(5)

모델 파라미터 저장

file_path = 'CIFAR10_ResNet18.pth'
torch.save(obj=model.state_dict(), f=file_path)

마치며

내일은 학원이 쉬는 날이지만 주말까지 일정이 있어서 공부를 많이 할 수는 없을 것 같다. 그래도 시간을 내서 개인 프로젝트를 조금이나마 진행해보면 좋을 것 같다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글