본문 바로가기

Deep Learning/Tensorflow

Tensorflow - Transfer Learning

반응형
Transfer Learning

 

 

특징을 잡아내는데에 잘만들어진 모델을 활용하는걸

Transfer_Learning이라고 한다.

컨볼루션과 풀링으로 이루어진

특징을잡아내는 CNN모델을 Base Model

분류하는데 사용한 ANN모델을 Head Model

이라고 한다.

 

 

 

import os
import zipfile
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# 파이썬의 진행상태를 표시해 주는 라이브러리
from tqdm import tqdm_notebook

from tensorflow.keras.preprocessing.image import ImageDataGenerator

%matplotlib inline
tf.__version__

 

 

zip_ref = zipfile.ZipFile('/content/cats_and_dogs_filtered.zip') # 압축파일 변수지정
zip_ref.extractall('./') # 압축풀기

# 파일 경로복사
train_dir = '/content/cats_and_dogs_filtered/train'
validation_dir = '/content/cats_and_dogs_filtered/validation'

 

 

 

Building the model : MobileNetV2 를 활용

 


Loading the pre-trained model (MobileNetV2)


모바일이나, 임베디드에서도 실시간을 작동할 수 있게


모델이 경량화 되면서도, 정확도 또한 많이 떨어지지 않게하여,

 

속도와 정확도 사이의 트레이드 오프 문제를 어느정도 해결한 네트워크 입니다.

 

 

 

base_model 설정

 

# 만드려는 모델의 이미지는 128, 128, 3으로 한다. (input_shape)
IMG_SHAPE = (128, 128, 3)

# 이미 만들어져서 학습이 완료된 모델을 가져오되, 헤드모델은 제외한 베이스모델만 가져온다.
# 파라미터는 자동으로 ImageNet으로 설정되어있기 때문에 실제로 사용할땐 두가지만 적어주면 된다.
base_model =  tf.keras.applications.MobileNetV2(input_shape = IMG_SHAPE, include_top = False)

# include_top = bool

# False면 잘만들어진 모델의 head model은 떼어내고 가져오는 것이고

# True면 잘만들어진 모델의 전체 model을 가져오는 것

len( base_model.layers )

 

# 우리가 가져온 모델의 Base Model은
# 특징을 잡아내는 역할을 하므로,
# 학습되지 않도록 한다.

base_model.trainable = False
base_model.summary()

 

 

모델링

 

# head_model은 base_model의 output을 가지고 만든다.
head_model = base_model.output

# ANN만들기 
# 함수형 모델링 코드
# 추가하고자하는 레이어를 쓰고 레이어 오른쪽에 모델을 넣으면 함수형 선언 코드를 통해 변수로 받을 수 있다.
# tf.keras.layers.GlobalAveragePooling2D를 이용해 베이스모델 아웃풋의 제일 큰 값을 받고
# 덴스설정으로 모델을 만들어 준다

head_model = tf.keras.layers.GlobalAveragePooling2D()(head_model)
head_model = tf.keras.layers.Dense(128, 'relu')(head_model)
head_model = tf.keras.layers.Dense(1, 'sigmoid')(head_model)

# base_model과 head_model을 하나의 model로 만들어주는 코드
model = tf.keras.models.Model(inputs = base_model.input, outputs = head_model)

model.compile( tf.keras.optimizers.RMSprop( 0.0001), loss = 'binary_crossentropy', metrics = ['accuracy'] )

 

 

이미지 증강

 

train_datagen = ImageDataGenerator(rescale = 1 / 255.0, rotation_range = 20, width_shift_range = 0.2, height_shift_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
validation_datagen = ImageDataGenerator( rescale = 1 / 255.0 )

train_generator = train_datagen.flow_from_directory(train_dir, target_size = (128, 128), class_mode = 'binary', batch_size = 128)
validation_generator = validation_datagen.flow_from_directory(validation_dir, target_size = (128, 128), class_mode = 'binary', batch_size = 128 )

 

 

학습

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

 

 

평가

model.evaluate(validation_generator)

반응형