본문 바로가기
인공지능/Deep Learning

[Deep Learning] 사진 분류하는 딥러닝 Transfer Learning으로 해보기 (MobileNetV2 활용)

by coding_su 2023. 1. 2.

📝개와 고양이 사진을 분류하는 딥러닝 Transfer Learning으로 해보기

Transfer Learning?
이미 학습이 완료된 인공지능을 가져다가 쓰는 것이다
= 내 데이터로 다시 재 학습(보강해서)해서 사용

MobileNetV2?
모바일이나 임베디드에서도 실시간을 작동할 수 있게 모델이 경량화 되면서도 정확도 또한 많이 떨어지지 않게하여 속도와 정확도 사이의 트레이드 오프 문제를 어느정도 해결한 네트워크

트랜스퍼 러닝에 사용 가능한 모델들 참고하기
(https://www.tensorflow.org/api_docs/python/tf/keras/applications)

 

트랜스퍼 러닝은 학습이 잘 된 모델을 가져와서 나의 문제에 맞게 활용하는 것이므로
학습이 잘 된 모델의 베이스모델만 가져온다(헤드 모델은 빼고 가져온다)

MobileNet (architecture that we use) supports: (96, 96), (128, 128), (160, 160), (192, 192), (224, 224)

import tensorflow as tf

# 만들려는 모델의 인풋 이미지는 (128, 128, 3)으로 한다
IMG_SHAPE = (128, 128, 3)

base_model = tf.keras.applications.MobileNetV2(input_shape= IMG_SHAPE, include_top= False)
# include_top= False 헤드모델 빼고 가져오기

 

.summary() 하면 학습 가능한 파라미터(Trainable params)가 있다

가져온 모델의 베이스 모델 부분은 이미 1400만장 이상의 이미지로 학습이 잘 되어서 이미지의 특징을 뽑아내는 역할을 하므로 내 데이터로는 학습이 되지 않도록 한다

base_model.trainable = False
# Trainable params: 0 이 된다

 

헤드모델을 만들어준다

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)

 

베이스모델과 헤드모델을 하나의 모델로 만든다

from keras.models import Model

model = Model(inputs= base_model.input, outputs= head_model)

 

모델을 컴파일한다

※ 실무에서는 데이터 증강까지 하도록 한다

from keras.optimizers import RMSprop

model.compile( RMSprop(learning_rate=0.0001),'binary_crossentropy',['accuracy'] )

traing_datagen = ImageDataGenerator(rescale = 1/255.0, width_shift_range=0.2)
test_datagen = ImageDataGenerator(rescale = 1/255.0)

train_generator = traing_datagen.flow_from_directory(train_dir, target_size=(128, 128), class_mode= 'binary', batch_size= 128)
test_generator = test_datagen.flow_from_directory(test_dir, target_size=(128, 128), class_mode= 'binary', batch_size= 128)

 

학습 / 평가

epoch_history = model.fit(train_generator, epochs= 5, validation_data= (test_generator))

model.evaluate(test_generator)

 

+ 추가로 파인튜닝(Fine tuning)을 해봤다

→ (https://coding-jisu.tistory.com/170)

댓글