본문 바로가기
딥러닝

[딥러닝] Transfer Learning과 Fine Tuning: MobileNetV2 ★

by eyoo 2022. 6. 16.

transfer learning으로 이미 잘 만들어진 모델을 가져와서 활용할수 있다.

 

CNN은 베이스와 헤드로 구분되는데 컨볼루션쪽이 베이스, ANN쪽이 헤드다.

 

이때 헤드를 재외한 베이스 모델을 활용하면 더 높은 성능의 CNN을 만들수있다.

 

MobileNetV2에서 베이스 모델을 가져와서 변수로 저장한다.

 

base_model =  tf.keras.applications.MobileNetV2(input_shape= (128, 128, 3), include_top=False)

# input_shape 파라미터에 들어가는 데이터의 형태를 입력한다.

# include_top 파라미터에 False를 입력하여 헤드를 제외한다.

 

 

베이스모델 부분은 사진의 특징을 잡아내는 역할을 하도록 학습 되어있는 상태이다.

 

그러므로 베이스모델이 학습되지 않게 한다.

 

base_model.trainable = False

 

 

이제 헤드 부분을 생성해야 한다.

 

베이스모델에서 출력되는 데이터를 헤드모델 변수로 저장한다.

 

head_model = base_model.output

 

 

그 후 추가하고자 하는 레이어를 쓰고 그 옆에 모델을 입력하면 모델 끝 부분에 해당 레이어를 연결시켜준다.

 

먼저 전체에서 제일 큰 값을 가져오는 GlobalAveragePooling2D 레이어를 생성했다.

 

haed_model = tf.keras.layers.GlobalAveragePooling2D()(head_model)

# 함수형 모델링을 사용한다.

 

 

같은 방식으로 다른 레이어도 만든다.

 

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

 

 

이제 베이스모델과 헤드모델을 합쳐서 하나의 모델 변수로 만들어준다.

 

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

# inputs 파라미터에 베이스모델의 인풋을 넣는다.

# outputs 파라미터에 헤드모델을 넣는다.

 

 

모델을 만들었으니 컴파일 하고 학습하면 된다.

 

트랜스퍼러닝을 한 상태에서 성능을 향상시키기 위해 특정 구간의 레이어를 튜닝할수있는데 이를 Fine tuning이라 한다.

※ 트랜스퍼러닝을 한 상태에서만 가능하다.

 

 

먼저 전체 베이스 모델의 레이어를 학습 가능하게 바꿔준다.

 

base_model.trainable = True

 

 

베이스 모델의 전체 레이어 수를 확인한다.

 

in:

len(base_model.layers)

out:

154

# 154개의 레이어가 있다.

 

 

어느 레이어까지 학습이 불가능하게 할지 정한 숫자를 변수로 정한다.

 

end_layer = 100

# 100번째까지는 학습되지 않도록 한다.

 

 

베이스 모델의 첫번째 레이어부터 정해진 레이어까지는 학습이 안되도록 설정해준다.

 

for layer in base_model.layers[ 0 : end_layer+1 ]:
  layer.trainable = False

# 반복문을 활용했다.

 

 

그 후 컴파일 하고 학습을 진행하여 튜닝한 결과를 확인하고 조정하면 된다.

 

 

 

 

댓글