본문 바로가기
C.W.K.
Stream
Lesson 03 of 07 · published

특징 추출

~8 min · transfer

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

1단계: 백본을 고정하고 새 출력 헤드만 학습해

특징 추출은 가장 안전하고 빠른 전이 학습 방식이야. base_model.trainable = False로 사전 학습된 가중치를 모두 잠그고 그 위에 작은 학습 가능 출력 헤드를 붙여. 신경망 대부분에서 그래디언트를 계산하지 않으므로 학습 비용과 GPU 메모리가 줄고, 이미 배운 특징을 망칠 위험도 없어. 항상 여기서 시작하고, 이 기준선의 성능이 정체될 때만 다음 과의 미세 조정을 검토해.

놓치기 쉬운 두 지점

출력 헤드는 의도적으로 작게 만들어. GlobalAveragePooling2D가 백본의 특징 맵을 이미지당 벡터 하나로 압축하고, Dropout은 작은 데이터셋의 과적합을 줄이며, 클래스 수에 맞춘 Dense가 최종 예측을 맡아. 코드에서는 다음 두 가지가 중요해:

  • 백본을 training=False로 호출해 BatchNormalization 레이어를 추론 모드에 둬. 가중치가 고정된 동안 내 자료로 누적 통계가 흔들리지 않게 하는 장치야.
  • Sequential로 감싸지 않고 keras.Input을 사용하는 함수형 구조로 작성해. 고정 백본과 학습 가능한 출력 헤드의 경계가 명시되고 다음 미세 조정 단계도 이 구조 위에 이어져.

Code

고정된 백본과 사용자 출력 헤드로 특징 추출·python
# Freeze the pretrained weights
base_model.trainable = False

# Add a custom classification head
inputs = keras.Input(shape=(224, 224, 3))
x = base_model(inputs, training=False)  # Keep BN in inference mode
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(5, activation="softmax")(x)

model = keras.Model(inputs, outputs)
model.compile(
    optimizer="adam",
    loss="categorical_crossentropy",
    metrics=["accuracy"],
)

# Train only the head (~5-10 epochs)
model.fit(train_ds, epochs=10, validation_data=val_ds)

External links

Exercise

고정한 ResNet50과 사용자 출력 헤드로 고양이·개 이진 분류기를 작성해. 이미지 1000개의 작은 부분집합으로 5에포크 학습하고, 같은 구조를 무작위 가중치에서 시작한 모델과 비교해 성능 차이를 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.