

일반적으로 탑층까지 그대로 사용하고, 이후 분류층은 새로운 테스크에 맞게 변경하고 학습시킨다.

사전학습 모델의 특징추출을 이용하고, 새로운 테스크에 맞게 기계학습 알고리즘으로 대체한다.
고려할 점
1) 학습모델과 테스크가 얼마나 유사한지
2) 특징추출이 얼마나 잘 작동하는지
테스크에 맞게 넣을 기계학습 알고리즘 예시


※ 분류 알고리즘에서 최종적으로 나온 라벨들의 확률값은 어떤 피처로 사용하기 어렵다.
어느 지점부터 새로운 알고리즘을 연결할지 고민해야한다.
테스크가 많이 일치하면 많은 부분을 사용하고, 테스크가 차이가 나면 일반적인 특성정보를 사용해야한다.
사전학습 모델의 특정레이어를 인풋으로 지정
각 층의 이름을 summary로 볼 수 있다.

Model(inputs=base_model.input, outputs=base_model.get_layer('avg_pool').output)
이 코드에서는 avg_pool의 아웃풋을 새로운 분류 알고리즘의 인풋으로 받을 것이다.
※ 모델 호출할때 include_top 속성이 있다. True면 분류부분 불러오기, False면 탑층빼고 불러오기
분류층은 가져오지 않음 + 사전학습모델 가중치 고정
model1 = MobileNet(include_top=False, input_shape=(IMG_WIDTH, IMG_HEIGHT, 3))
def model_maker():
# top 층을 제외한 사전학습 모형 호출
base_model = MobileNet(include_top=False,
input_shape=(IMG_WIDTH, IMG_HEIGHT, 3))
for layer in base_model.layers[:]:
layer.trainable = False
input1 = Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3))
custom_model = base_model(input1)
custom_model = GlobalAveragePooling2D()(custom_model) # 각 채널 (7x7 채널)에서 평균값 하나만 추출
# 기본 네트워크의 출력 feature 맵의 차원(높이 및 너비)을 줄임
custom_model = Dense(64, activation='relu')(custom_model)
predictions = Dense(NUM_CLASSES, activation='softmax')(custom_model)
# 출력 층, NUM_CLASSES : 예측 클래스 수 = 2
return Model(inputs=input1, outputs=predictions)
for layer in base_model.layers[-30:]:
-> 마지막 30개의 레이어를 학습가능하게 설정함
기존 데이터를 변형, 확장하여 학습시키는 것

정의
모델 전체 또는 대부분의 layer에 대한 가중치 학습
새로운 데이터가 많이 필요하다.
어떤 층을 다시 학습할 것인가
가중치 동결 - 새로운 데이터에 대한 학습과정에서 가중치가 변경되지 않는다
학습 가능한 가중치 - 파인튜닝과정에서 학습이 이뤄지는 부분 -> 특정한 테스크에 맞게 학습이 이뤄짐(가중치 조정)
포인트
어떻게할지는 데이터 양과 태스크 비슷한 정도로 판단을 한다.