본문 바로가기

머신러닝공부

전이학습 Transfer Learning 간단 정리

728x90
반응형

개념 및 필요성

CNN 모델의 품질을 높이기 위해서는 즉, 임의의 데이터에 대해서 정확도는 높이고 오버피팅은 줄이기 위해서는 기본적으로 많은 양의 데이터를 이용하여 학습해야한다.

그러나 많은 학습 데이터를 확보하려면 많은 비용과 시간이 소모되기 때문에 현실적으로 쉽지않은데, 이러한 데이터 부족 어려움을 해결하기 위해 등장한것이 전이학습이다.

 

전이학습(Transfer Learning)이란 아주 큰 데이터 set, 즉 21,841 부류에 대해서 총 1419만7122장의 이미지로 구성되어 있는 ImageNet 데이터를 사용해서 학습된 모델의 가중치를 가져와서 우리가 해결하려는 문제에 맞게 가중치를 보정해서 사용하는 것을 의미한다. 이 때 큰 데이터 set을 사용해서 훈련된 모델을 사건 학습 모델(pre-trained model)이라고 한다.

※ ImageNet 데이터의 이미지는 평균적으로 469 x 387이며, 이러한 2만개 이상의 부류 가운데 100부류만 뽑아서 데이터를 구성하고, 정확도를 높이는 대회가 ImageNet Challenge이다.

사전 학습 모델(pre-trained model) 구조

사전 학습된 특징 추출기

Conv -> Conv -> Pooling ->

특징 추출기는 컨볼루션층과 풀링층의 조합으로 구성되어 있으며 ImageNet 데이터에 대해 이미 학습되어 있다.

※ 특징 추출기의 출력 데이터를 bottleneck 또는 feacute vector 등으로 지칭한다.

 

사전 학습된 분류기

Dense -> Dense -> Dense(Softmax) ->

분류기는 완전 연결층으로 구성되며 추출된 특징을 입력으로 받아 최종적으로 주어진 이미지에 대한 클래스(정답)을 카테고리 형식으로 분류하는 역할을 수행한다.

※ 오버피팅을 줄이기 위해 출력층 이전의 Dense Layer 사이에는 Dropout, BatchNormalization layer 등을 add 할 수 있다.

 

사전 학습 모델의 종류

이용자가 사용할 데이터 set에서 어떤 구조의 모델이 최고 성능을 낼지 모르기 때문에, 다양한 모델을 사용하여 학습시켜보고 결과를 비교해보는 것도 중요하다.

 

파인 튜닝(fine-tuning)

사전 학습 모델의 가중치를 미세하게 조정하는 기법이며, 새롭게 분류하려는 데이터의 종류와 전체 개수를 미리 분석한 후에, 그것을 바탕으로 사전 학습 모델 가중치 일부만을 재학습 시키거나 또는 모든 가중치를 처음부터 다시 학습 시킬 수 있음

※ 파인 튜닝 진행시 많은 연산량이 필요하므로 일반적으로 CPU보다는 GPU를 많이 사용함

 

Transfer Learning 사용법

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.applications import VGG16, ResNetSO, MobileNet, InceptionV3 # tensorflow에서 제공되는 다양한 사전학습모델
base_model = VGG(weights='imagenet', # 사전학습에 사용된 데이터set
		include_top=False, # False인 경우 특징 추출기만 가져옴, True인 경우 특징 추출기와 분류기를 모두 가져옴
                input_shape=(240, 240, 3)) # 새롭게 학습시킬 이미지 텐서 크기
base_model.summary()

model = Sequential()

model.add(base_model)

model.add(Faltten()) # 특징 추출기 값은 Tensor이므로 신경망 구축을 위해 1차원 벡터로 변환하는 역할을 Flatten() 레이어가 수행하며, 최근에는 Flatten()이외에 GlobalAveragePooling2D() 함수도 자주 사용된다.

# 새로운 분류기(Classifier)
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(4, activation='softmax'))

model.compile(loss='sparse_categorial_crossentropy', optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy'])

model.summary()

 

반응형