Python/DeepLearning

Transfer Learning - 전이학습 (학습된 모델 가져와 응용하기)

하니__ 2024. 4. 19. 11:06
트랜스퍼 러닝

 
학습이 잘 된 모델을 가져와서 우리의 문제에 맞게 활용하는것,
학습이 잘 된 모델의 베이스 모델만 가져온다(헤드 모델은 빼고)
 

IMG_SHAPE = (128, 128, 3)
base_model =  tf.keras.applications.MobileNetV2(input_shape = IMG_SHAPE,
                                                 include_top=False,
                                                 weights='imagenet')

 
 
MobileNetV2 모델을 로드하고 초기화하여 파라미터 안에 새로운 정보를 입력받는다

 
input_shape 은 모델의 입력 이미지의 크기를 지정하며 미리 128x128 사이즈의 컬러이미지라고 변수지정을 해줬다

 
include_top 은 상단 레이어를 포함할지의 여부를 묻는 것인데
False 로 선택하면 모델의 기본적인 피처 추출(특징 추출) 기능만 사용된다
새로운 레이어를 추가하고 재학습하여 사용자의 특정한 작업에 최적화되어 있다
만약 True로 설정한다면 특정한 데이터셋에 대한 분류 작업을 위해서는 모델을 재훈련해야 한다
 
weights 는 사용할 가중치 파일을 지정하는데 imagenet으로 설정되어 있어서
사전 학습된 MobileNetV2 모델의 가중치를 ImageNet 데이터셋에서 학습한 값으로 로드하겠다는 의미다
 
 
즉, 사전 학습된  입력 이미지의 피처(특징) 지도를 추출하는 기능을 수행하는 MobileNetV2 모델을
best_model로 지정한 것
 
 

base_model.summary()

현재 베이스 모델의 학습 가능한 파라미터는 
2257984 개의 데이터중
2223872 다
 

학습된 데이터 new 학습 방지

 
잘 만들어진 베이스 모델 부분은 이미 1400만장으로 학습이 잘 되어있고
이미지의 특징을 뽑아내는 역할을 하는 부분이므로
우리 데이터로 다시 학습 되지 않도록 한다
이유는 하단 링크를 참조하자
 
 

Fine Tuning

파인 튜닝은 트랜스퍼 러닝 후에 하는 방법이며 트랜스퍼 러닝 후 조금 더 개선이 가능한지 해보는 방법 학습된 모델 그 상태에서 추가로 학습을 시키되 좋은 모델의 일부분을 우리 데이터로 학

hani08.tistory.com


 
 
 
 
 

base_model.trainable = False
base_model.summary()

.trainable = False를 통해
훈련 가능한 데이터를 없도록 한다
 
 
 

우리 학습환경에 맞는 헤드 모델 정의

 
 

from keras.layers import Flatten,Dense
head_model = base_model.output
head_model = Flatten()(head_model)
head_model = Dense(128,'relu')(head_model)
head_model = Dense(1,'sigmoid')(head_model)

base_model의 출력 레이어를 head_model로 지정하고
기존의 시퀀셜이 없는 반면

(head_model)이 레이어의 add 기능을 도와준다

 
 
 

위의 잘 학습된 베이스 모델과 우리의 헤드 모델, 두 모델을 합친다

 

from keras.models import Model
model = Model(inputs = base_model.input, outputs = head_model)
model.summary()

 

우리의 헤드모델덕에 훈련 가능한 파라미터의 갯수가 늘었다( 총 데이터 또한 늘었다 )
 

모델 컴파일링

 

from keras.optimizers import RMSprop
model.compile(RMSprop(0.0001),loss = 'binary_crossentropy',metrics = ['accuracy'] )
train_datagen = ImageDataGenerator( rescale = 1 / 255,
                    zoom_range = 0.2,
                    width_shift_range = 0.2,
                    height_shift_range = 0.2)
train_generator = train_datagen.flow_from_directory(train_dir,
                                  target_size = (128,128),
                                  class_mode = 'binary')
Found 2000 images belonging to 2 classes.
val_datagen = ImageDataGenerator( rescale = 1 / 255)
val_generator = train_datagen.flow_from_directory(val_dir,
                                  target_size = (128,128),
                                  class_mode = 'binary')
Found 1000 images belonging to 2 classes.

 
 
 
 
 

모델 학습
epoch_history = model.fit(train_generator,
                          epochs = 5,
                          validation_data = val_generator)

 
 
잘 학습되어있는 모델을 가져와 그런지
밸리데이션의 정확도가 94~95퍼센트를 기록한다
 
 
 

잘 분류 하는지 검증
import numpy as np
from google.colab import files
from keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys():

  # predicting images
  path = '/content/' + fn
  img = image.load_img(path, target_size=(128,128))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

images = np.vstack([x])

images = images/255
print(images)


classes = model.predict(images, batch_size=10)
print(classes[0])
if classes[0]>0.5:
  print(fn + " is a dog")
else:
  print(fn + " is a cat")

 

 
94%확률로 개 사진을 잘 판별하는것을 확인 할 수 있겠다