데이터 분석가
article thumbnail
Published 2023. 8. 31. 20:48
CNN_사전훈련된 모델 DeepLearning

이전 내용 확인

  • 이번 글에서는 이전 블로그 처럼 소규모의 데이터로 훈련된 모델로 이미지 분류를 진행하는 대신 사전훈련된 모델로 이미지 분류를 진행해 보겠습니다. 사전훈련된 모델은 대량의 데이터셋을 기반으로 미리 훈련된 모델인데, 학습에 사용된 데이터셋이 충분히 크고 일반적이라면 적용할 분류문제가 훈련에 사용된 데이터셋과 동떨어져 있더라도 사전훈련 모델을 적용 가능합니다.

교재 홍보

 

케라스 창시자에게 배우는 딥러닝 개정 2판 - 예스24

단어 하나, 코드 한 줄 버릴 것이 없다!단 한 권의 딥러닝 책을 선택한다면 바로 이 책이다!케라스 창시자이자 구글 딥러닝 연구원인 저자는 ‘인공 지능의 민주화’를 강조한다. 이 책 역시 많

www.yes24.com

사전훈련 모델 가져오기

  • ImageNet 데이터셋을 통해 사전훈련된 VGG16 모델의 합성곱 기반 층을 가져옵니다. 합성곱 기반층이란 연속된 합성곱과 풀링층으로 이루어진 층을 말합니다.
  • 이때 기존의 밀집 연결 분류기는 사전 훈련될 때의 데이터에 특화되어 있기 때문에 새로운 데이터를 합성곱 기반층에 통과시켜 밀집 연결 분류기를 새로 훈련합니다.
from tensorflow.python.util.traceback_utils import include_frame

# 2014년에 제안된 모델
conv_base = keras.applications.vgg16.VGG16(
    weights='imagenet', # 모델을 초기화할 가중치 체크포인트 지정
    include_top = False, # 밀집 연결 분류기의 포함 여부
    input_shape = (180, 180, 3) # 모델에 입력할 이미지의 크기
)
  • VGG16 모델의 합성곱 기반 층의 구조의 일부입니다. 밀집 연결층과 연결해야 하기 때문에 최종 특성 맵의 크기가 (5, 5, 512)인 것을 기억합시다.
conv_base.summary()

데이터 전처리

  • 훈련, 검증, 데이터셋에 정의한 함수를 실행하여 특성과 레이블을 추출하겠습니다.
  • 혹시 데이터가 정의되지 않았다면 이전 블로그를 참조해주기 바랍니다.
import numpy as np

def get_features_and_labels(dataset):
    all_features = [] # 특성
    all_labels = [] # 각 특성에 맞는 label
    for images, labels in dataset:
        preprocessed_images = keras.applications.vgg16.preprocess_input(images)
        features = conv_base.predict(preprocessed_images) # conv_base모델의 predict() 실행하여 넘파이 배열로 특성을 추출
        all_features.append(features)
        all_labels.append(labels)
    return np.concatenate(all_features), np.concatenate(all_labels)

train_features, train_labels =  get_features_and_labels(train_dataset) # 추출한 특성과 레이블을 할당
val_features, val_labels =  get_features_and_labels(validation_dataset)
test_features, test_labels =  get_features_and_labels(test_dataset)

밀집 연결 분류기 및 모델 생성

  • 밀집 연결 분류기를 정의한 뒤 모델을 생성해보겠습니다.
  • 밀집 연결층을 설정하는 방법에는 두가지가 있는데, 방법 1로 진행해 보도록 하겠습니다.
    • 방법 1 : 데이터 증식을 사용하지 않는 특성 추출
    • 방법 2 : 데이터 증식을 사용한 특성 추출
inputs = keras.Input(shape=(5, 5, 512)) # 위에서 살펴본 VGG16의 최종 특성맵의 크기가 5, 5, 512이므로 인풋 이미지의 크기도 동일하게 설정
x = layers.Flatten()(inputs) # Dense 특성 주입하기 전에 차원을 맞추기 위해 Flatten층 사용
x = layers.Dense(256)(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.compile(loss="binary_crossentropy",
              optimizer="rmsprop",
              metrics=["accuracy"])

모델 훈련

  • 모델을 훈련해줍니다. 합성곱 기반 층은 불러왔기 때문에 2개의 Dense층만 훈련하므로 속도가 매우 빠릅니다.
callbacks = [
    keras.callbacks.ModelCheckpoint(
      filepath="feature_extraction.keras",
      save_best_only=True,
      monitor="val_loss")
]

history = model.fit(
    train_features, train_labels,
    epochs=20,
    validation_data=(val_features, val_labels),
    callbacks=callbacks)

손실과 정확도 그래프

  • vis함수를 이용해 그래프를 그려줍니다.
  • 결과를 보면 97% 이상의 높은 검증정확도를 보이고 있습니다. 하지만 이는 기존의 ImageNet 데이터셋에 개와 고양이 샘플이 많은 영향도 있을 것 입니다.
  • 훈련 정확도를 보면 드롭아웃을 했음에도 불구하고 5에포크만에 과대적합이 일어났는데, 이는 작은 이미지 데이터셋에서 데이터 증식의 필요성을 나타냅니다. 다음 글에서는 간단한 사전 훈련 모델의 적용과 '방법 2 : 데이터 증식을 사용한 특성 추출'을 적용해 보겠습니다.
vis(history)

'DeepLearning' 카테고리의 다른 글

회귀 모델_Boston 주택가격  (0) 2023.09.01
CNN_데이터 증식  (0) 2023.09.01
CNN_데이터 증식  (0) 2023.08.30
CNN_강아지 vs 고양이  (0) 2023.08.30
CNN_MNIST  (0) 2023.08.29
profile

데이터 분석가

@이꾹꾹

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!