article thumbnail image
Published 2022. 4. 5. 11:31

📌 이 글은 권철민 님의 딥러닝 CNN 완벽가이드를 바탕으로 작성한 포스팅입니다.


목차

  1. Pretrained 모델의 Fine Tuning(미세 조정)
  2. Fine Tuning 특성
  3. 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
복사했습니다!