Post

CNN을 실무에서 쓰는 표준 패턴: 전이학습과 파인튜닝

전이학습과 파인튜닝으로 CNN을 재사용하는 실무 표준 패턴과 헤드·동결 전략

CNN을 실무에서 쓰는 표준 패턴: 전이학습과 파인튜닝

문제 정의

CNN 기반 이미지 분류는 이미지를 입력받아 클래스 확률을 출력하는 문제다. 실무의 핵심은 “모델을 새로 만드는 것”이 아니라 이미 학습된 시각 표현을 어떻게 재사용할 것인가다.

요약 한 줄 전이학습은 선택지가 아니라 기본값이다.


1) 합성곱 · 풀링 · 평탄화의 핵심 의미

정의

  • 합성곱(Convolution): 국소 영역에서 패턴을 감지
  • 풀링(Pooling): 위치 민감도를 낮추며 정보 요약
  • 평탄화(Flatten): 공간 정보를 벡터로 변환

직관

CNN은 이미지를 한 번에 이해하지 않는다.

  • 합성곱: “이 위치에 이런 패턴이 있다”
  • 풀링: “정확한 위치는 중요하지 않다”
  • 평탄화: “이제 분류기로 넘길 준비 완료”

오해 포인트

  • 풀링은 정보를 버린다 → 불필요한 위치 정보만 제거
  • 합성곱은 엣지만 본다 → 계층적으로 복잡한 패턴 학습

언제 쓰는가 / 쓰지 말아야 하는가

  • ✔ 이미지/영상 전반
  • ✘ 표 형식·비공간 데이터

구현 체크리스트

  • 입력 해상도 고정
  • 풀링 과도 사용 금지(초기 층 위주)

요약

CNN은 공간 정보를 단계적으로 요약한다.


2) 전이학습이 기본값인 이유

정의

전이학습은 대규모 데이터로 학습된 CNN의 가중치를 재사용하는 방식이다.

직관

  • 초기 CNN 층: 엣지·코너 같은 보편적 시각 특징
  • 뒤쪽 층: 도메인 특화 패턴

이미 학습된 “눈”을 빌려 쓰는 것이 빠르고 안전하다.

오해 포인트

  • 내 데이터와 다르면 소용없다 → 초기 층은 대부분의 이미지에 유효

언제 쓰는가 / 쓰지 말아야 하는가

  • ✔ 데이터 수천 장 이하
  • ✘ 도메인이 극단적으로 다름(의료·위성 등은 주의)

구현 체크리스트

  • 사전학습 가중치(ImageNet 등) 확인
  • 입력 정규화 방식 일치

요약

전이학습은 시간·성능·안정성의 타협점이다.


3) 사용자 정의 분류 헤드 설계

정의

사전학습 CNN 위에 문제 전용 분류기(head) 를 붙인다.

직관

백본은 “보는 법”, 헤드는 “판단 기준”이다.

주의점

  • 드롭아웃: 과적합 완화
  • 배치정규화: 학습 안정성 향상
  • 과도한 Dense 층은 오히려 성능 저하

오해 포인트

  • 헤드를 복잡하게 만들수록 성능 ↑ → 데이터가 적을수록 단순하게

구현 체크리스트

  • 클래스 수와 출력층 일치
  • softmax ↔ categorical loss 짝 확인

요약

헤드는 가볍고 명확하게 설계한다.


4) 파인튜닝: 어디까지 얼릴 것인가

정의

파인튜닝은 사전학습 가중치 일부를 풀어 미세 조정하는 과정이다.

직관

  • 초기: 모든 백본 freeze → 안정적 학습
  • 이후: 상위 블록 일부만 unfreeze

기준

  • 데이터 적음: 거의 freeze
  • 데이터 충분: 상위 10~30% 레이어만 조정

오해 포인트

  • 처음부터 전체 unfreeze → 손실 폭주·과적합 위험

구현 체크리스트

  • 학습률 감소 후 unfreeze
  • BN 레이어 동결 여부 확인

요약

파인튜닝은 점진적이어야 한다.


5) 감정 분류 예시로 보는 현실적 문제

데이터 편향

  • 특정 성별/연령/표정 과대표집 → 실환경 성능 급락

레이블 노이즈

  • 감정은 주관적 → 정답 자체가 흔들림

일반화

  • 스튜디오 이미지 → 웹캠 적용 실패 빈번

대응

  • class imbalance 가중치
  • 검증셋을 환경별로 분리

요약

감정 분류는 모델보다 데이터 문제가 크다.


전이학습 체크리스트 (10)

  1. 입력 해상도 고정
  2. 사전학습 정규화 방식 일치
  3. 클래스 불균형 확인
  4. 데이터 증강 과도 여부
  5. 헤드 파라미터 수 제한
  6. 초기 freeze 여부
  7. 파인튜닝 시 학습률 감소
  8. 검증셋 분리 기준 명확화
  9. 혼동행렬 확인
  10. 운영 환경 테스트

핵심 코드 스니펫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
base = tf.keras.applications.ResNet50(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)

base.trainable = False  # 초기 freeze

x = tf.keras.layers.GlobalAveragePooling2D()(base.output)
x = tf.keras.layers.Dense(256, activation='relu')(x)
x = tf.keras.layers.Dropout(0.5)(x)
outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)

model = tf.keras.Model(base.input, outputs)

주의

  • include_top=False 필수
  • GlobalAveragePooling으로 파라미터 폭증 방지

최종 요약

  • CNN은 정보 요약 장치
  • 전이학습은 기본 전략
  • 헤드는 단순하게
  • 파인튜닝은 단계적으로
  • 데이터 품질이 성능을 좌우

다음 액션 플랜 (5줄)

  1. 사전학습 CNN으로 baseline 구축
  2. freeze 상태에서 성능 확인
  3. 데이터 분포/편향 점검
  4. 상위 레이어만 파인튜닝
  5. 운영 환경에서 재검증

This post is licensed under CC BY 4.0 by the author.