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
# 반복문을 활용했다.
그 후 컴파일 하고 학습을 진행하여 튜닝한 결과를 확인하고 조정하면 된다.
'딥러닝' 카테고리의 다른 글
Chat GPT를 이용한 NLP 개발 학습하기 (0) | 2023.03.20 |
---|---|
[딥러닝] ModelCheckpoint 와 CSVLogger 콜백 (0) | 2022.06.16 |
[딥러닝] 이미지 증강(Augmentation): 이미지 , 넘파이 어레이 (0) | 2022.06.15 |
[딥러닝] 디렉토리를 따로 만들어서 학습데이터 저장: mkdir, listdir (0) | 2022.06.15 |
[딥러닝] horse-or-human CNN 실습, 압축, 이미지 처리: extractall, ImageDataGenerator, flow_from_directory (0) | 2022.06.15 |
댓글