📌 이 글은 권철민 님의 딥러닝 CNN 완벽가이드를 바탕으로 작성한 포스팅입니다.
목차
- Pretrained 모델의 Fine Tuning(미세 조정)
- Fine Tuning 특성
- Fine Tuning 실습 (with cat-and-dog)
Pretrained 모델의 Fine Tuning(미세 조정)
Fine Tuning은 Pretrained 모델을 커스텀 모델을 활용할 시 ImageNet으로 학습된 Feature Extractor의 가중치 값의 급격한 변화를 제어하기 위해 적용하는 방법
1단계
- train을 할 수 있느냐? = weight를 업데이트 할 수 있느냐?
- Layer를 freeze 한다 = weight를 업데이트 할 수 없게 한다.
- Feature Extractor는 Freeze 시켜버리고 Classification layer만 학습시킨다.
2단계
- 1단계 보다는 Learning Rate를 감소시켜 적용
- 전체 Layer 들을 Unfreeze(trainable=True) 시켜서 학습에서 제외(Feature Extractor도 학습을 시킨다.)
- 단, 일반적으로 BatchNormalization Layer는 계속 Freeze 시킨다.
학교 짱도 전학가면 기싸움 해야하는 것처럼 진행됨
Fine Tuning 특성
- Fine Tuning이 언제나 모델 성능을 가져오는 것은 아니다.
- ImageNet 학습과 유사한 데이터 세트에서 사용을 권장한다.
- 개별 클래스 별로 데이터 건수가 작을 경우 사용을 권장한다.(오버피팅 개선 효과)
Pretrained 모델에 Fine Tuning 적용
- 1단계는 10회 epochs로 Feature Extractor layer들의 trainable=False로 설정하여 학습에서 제외하고 Classification layer들만 학습.
- 2단계는 10회 epochs로 전체 layer를 trainable=True로 설정하되 BatchNormalization layer는 계속 제외함. learing rate는 1단계의 1/10 수준으로 줄임.
from tensorflow.keras import layers
def train_model_fine_tune(data_df, model_name, augmentor, preprocessing_func):
# 학습/검증/테스트용 이미지 파일 절대경로와 Label encoding 된 데이터 세트 반환
tr_path, tr_label, val_path, val_label, test_path, test_label = get_train_valid_test(data_df)
# 학습과 검증용 Sequence Dataset 생성.
tr_ds = CnD_Dataset(tr_path, tr_label, batch_size=BATCH_SIZE, augmentor=augmentor, shuffle=True, pre_func=preprocessing_func)
val_ds = CnD_Dataset(val_path, val_label, batch_size=BATCH_SIZE, augmentor=None, shuffle=False, pre_func=preprocessing_func)
# 입력된 model_name에 따라 모델 생성.
model = create_model(model_name=model_name)
# 최종 output 출력을 softmax에서 sigmoid로 변환되었으므로 binary_crossentropy로 변환
model.compile(optimizer=Adam(0.0001), loss='binary_crossentropy', metrics=['accuracy'])
# feature extractor layer들을 freeze
for layer in model.layers[:-4]:
layer.trainable = False
FIRST_EPOCHS = 10
SECOND_EPOCHS = 10
# 1단계 fine tuning 학습 수행.
history = model.fit(tr_ds, epochs=FIRST_EPOCHS, steps_per_epoch=int(np.ceil(tr_path.shape[0]/BATCH_SIZE)), validation_data=val_ds, validation_steps=int(np.ceil(val_path.shape[0]/BATCH_SIZE)),verbose=1)
# 전체 layer들을 unfreeze, 단 batch normalization layer는 그대로 freeze
for layer in model.layers:
if not isinstance(layer, layers.BatchNormalization):
layer.trainable = True
# 2단계는 learning rate를 기존 보다 1/10 감소
model.compile(optimizer=Adam(0.00001), loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(tr_ds, epochs=SECOND_EPOCHS, steps_per_epoch=int(np.ceil(tr_path.shape[0]/BATCH_SIZE)), validation_data=val_ds, validation_steps=int(np.ceil(val_path.shape[0]/BATCH_SIZE)),verbose=1)
return model, history
'🖼 Computer Vision > CNN' 카테고리의 다른 글
CNN - Keras LearningRageScheduler (0) | 2022.04.06 |
---|---|
CNN - EfficientNet (0) | 2022.04.04 |
CNN - ResNet (0) | 2022.04.02 |
CNN - GoogLeNet (0) | 2022.04.01 |
CNN - VGGNet (0) | 2022.04.01 |