반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

블로그

[CV] 시각지능 딥러닝 #3 Transfer Learning 전이 학습 본문

공부/DL

[CV] 시각지능 딥러닝 #3 Transfer Learning 전이 학습

beenu 2024. 4. 3. 16:43
반응형
Review
  • Feature Representation : 연결된 것으로부터 새로운 feature들을 만듦 (재표현)
    • Dense : 고수준 피처 개수 조절
    • Node : 피처 개수 조절
  • Image Data Augmentation
    • 현실 세계에서는 가지고 있는 데이터가 매우 부족함
    • 갖고있는 적은 데이터라도 최대한 활용하기 위해 augmentation 사용 

 

Transfer Learning
  • Augmentation의 한계
    • 원본과 확연히 다른 새로운 특징은 만들어낼 수 없음
    • 애초에 양과 질 모두 충족하는 적절한 데이터여야 학습에 도움이 됨
  • 개인이 수집 불가능할 정도의 데이터 + 성능이 훌륭한 모델 구조와 가중치를 가진 모델을 가져와 사용
  • Pretrained Model : 가져온 그 상태 그대로 사용
  • Fine Tuning : 잘 만들어진 모델을 우리 문제에 맞게 구조를 변경하거나 재학습시키는 것
    • 보유하고 있는 데이터가 부족한 경우
  • Frozen : 가져온 모델의 가중치를 새로 업데이트하지 않고 가지고 있는 가중치를 그대로 사용
  • Fine Tuning 전략
    1. 데이터 多, 문제와 사전 학습 모델이 유사 => 모델 뒷부분 위주로 재학습!
    2. 데이터 多, 문제와 사전 학습 모델이 상이 => 모델 전체 재학습!
    3. 데이터 少, 문제와 사전 학습 모델이 유사 => 모델 뒷부분 중의 뒷부분만 재학습!
    4. 데이터 少, 문제와 사전 학습 모델이 상이 => 모델 뒷부분 위주로 재학습!
  • ResNet50 모델 Fine Tuning 실습
from keras.applications.resnet50 import ResNet50
from keras.backend import clear_session
from keras.layers import Dense
from keras.layers import GlobalAveragePooling2D
clear_session()

base_model = ResNet50(weights='imagenet',       # ImageNet 데이터를 기반으로 미리 학습된 가중치 불러오기
                      include_top=False,        # ResNet 모델의 아웃풋 레이어는 제외하고 불러오기
                      input_shape= (32,32,3),   # 입력 데이터의 형태
                      pooling='avg'             # Global Average Pooling 2D
                      )

new_output = Dense(10, # class 10개
                   activation = 'softmax')(base_model.output)

model = keras.models.Model(base_model.inputs, new_output)

model.summary()
# 모델의 가중치를 그대로 사용할 레이어와 추가 학습할 레이어를 결정
for layer in model.layers[:-1] :
    layer.trainable = False
model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'],
             optimizer=keras.optimizers.Adam(learning_rate=0.001) )

from keras.callbacks import EarlyStopping, ReduceLROnPlateau

# 검증 손실이 개선되지 않을 때 학습률을 동적으로 조정하여 학습을 최적화하는 콜백 함수
lr_reduction = ReduceLROnPlateau(monitor='val_loss',
                                 patience=4,
                                 verbose=1,
                                 factor=0.5,
                                 min_lr=0.000001)

es = EarlyStopping(monitor='val_loss',
                   min_delta=0, # 개선되고 있다고 판단하기 위한 최소 변화량
                   patience=2,  # 개선 없는 epoch 얼마나 기다려 줄거야
                   verbose=1,
                   restore_best_weights=True)
                   
hist = model.fit(train_x, train_y,
                 validation_split=0.2,
                 epochs=1000, verbose=1,
                 callbacks=[es, lr_reduction]
                 )
728x90
반응형