[DL] 실습 - 전이학습 (개,고양이 분류)

Minjeong Kim·2026년 1월 7일

인공지능

목록 보기
33/50

📢 이미지넷 1,000개 카테고리로 학습된 VGG16 모델을 이용하여 개, 고양기 분류 모델을 만들어 보자!

과정

  1. 데이터 불러오기

    data = np.load('./data/np_cats_dogs.npz')
    
    # 저장되어 있는 데이터 변수에 저장
    X_train = data['X_train']
    X_test = data['X_test']
    y_train = data['y_train']
    y_test = data['y_test']
  2. 모델 불러오기

    # VGG16 모델 불러오기
    from tensorflow.keras.applications import VGG16
  3. 모델 객체 생성

    • 모델의 특성 추출부만 불러오기
      # 객체 생성
      vgg16 = VGG16(include_top=False,
                    weights = 'imagenet',
                    input_shape = (224,224,3))
      • include_top
        • top = classifier
        • classifier 포함할지 여부로, Flase 면 '미포함'
        • VGG16 의 class 는 1000개이고, 우리는 이진분류 할거라서
      • weights
        • 초반에는 이미지넷에 있는 하이퍼 파라미터를 사용하겠다
      • input_shape
        • 224*224 컬러이미지
    • 모델 정보 확인
      # 모델 정보 요약
      vgg16.summary()
      • vgg.summary()

Conv 층 미세조정 설정

1. 동결

  • 모든 Conv 층 학습 시, 가중치의 갱신 막음
  • VGG16 모델의 성능이 좋아서 그대로 사용하고 싶은 경우!
    • 학습 시 가중치가 갱신되도록 설정하면 기존 학습된 내용이 훼손되므로, 성능 떨어짐. 그래서 그대로 사용하겠다는 것이 “동결” !
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten
from tensorflow.keras.optimizers import Adam

# 뼈대 생성
transfer_model = Sequential()

# feature extractor (VGG)
transfer_model.add(vgg16)

# classifier
transfer_model.add(Flatten())
transfer_model.add(Dense(units = 64, activation = 'relu'))

# ouptut layer
transfer_model.add(Dense(units = 1, activation = 'sigmoid'))

# 학습 방법 및 평가 방법 설정
transfer_model.compile(loss = 'binary_crossentrophy',
                       optimizer = Adam(),
                       metrics = ['accuracy'])

# 학습 <- skip
for layer in vgg16.layers:
  layer.trainable = False # 모든 층의 가중치 업데이트 X (동결!)

h = transfer_model.fit(X_train, y_train,
                       validation_split = 0.2,
                       epochs = 10)
  • model summary
    - 기존 vgg16 모델에 flatten + dense 2개 층 추가됨 확인

2. 미세조정 (fine tunning)

  • 사전학습된 모델을 재학습하여 나의 새로운 데이터에 맞게끔 세밀하게 조정
  • 마지막 합성곱 층만을 나의 데이터로 재학습
  • 층이름.trainable
    • True : 학습 가중치 업데이트 O
    • False : 학습 가중치 업데이트 X (즉, 동결)
  1. 마지막 합성곱 층 학습 가중치 업데이트 설정

    # 미세조정
    for layer in vgg16.layers:
      if layer.name == 'block5_conv3':
        layer.trainable = True  # 학습 가중치 업데이트 O
      else:
        layer.trainable = False # 학습 가중치 업데이트 X (즉, 동결)
    • default= True
      • False 로 바꿔주지 않으면, 모든 층의 가중치 업데이트 되어서 새로 학습해버림!
      • 그래서 원하는 layer 에만 True 를 설정해주고, 나머지에는 False 로 설정하기
  2. 학습

    h = transfer_model.fit(X_train, y_train,
                           validation_split = 0.2,
                           epochs = 10)
  • 결과

    성능 짱 좋아짐 ….

    but 아직 과적합 ㅠㅠ → 이건 데이터 부족해서 그런 것. 데이터 증강시켜서 하면 괜찮아질 것 임!

    기본 CNN 모델 대비, 성능 좋아짐 !!!!

0개의 댓글