CNN을 실무에서 쓰는 표준 패턴: 전이학습과 파인튜닝
전이학습과 파인튜닝으로 CNN을 재사용하는 실무 표준 패턴과 헤드·동결 전략
Posted
By okorion
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)
- 입력 해상도 고정
- 사전학습 정규화 방식 일치
- 클래스 불균형 확인
- 데이터 증강 과도 여부
- 헤드 파라미터 수 제한
- 초기 freeze 여부
- 파인튜닝 시 학습률 감소
- 검증셋 분리 기준 명확화
- 혼동행렬 확인
- 운영 환경 테스트
핵심 코드 스니펫
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줄)
- 사전학습 CNN으로 baseline 구축
- freeze 상태에서 성능 확인
- 데이터 분포/편향 점검
- 상위 레이어만 파인튜닝
- 운영 환경에서 재검증
This post is licensed under CC BY 4.0 by the author.
