VGG16
Max-pooling, Flatten, Normalization 레이어들을 제외한 16개의 레이어들로 구성되어 있다.
1000 종류의 이미지로 구성되어 있는 ImageNet 이미지 데이터셋을 가지고 학습을 하였기 때문에 마지막 레이어인 SoftMax에 의해 분류되는 클래스는 1000 개가 된다.
모델의 하위 레이어들은 특징 추출(feature extraction)에 집중을 하고 상위 레이들은 분류(classification)에 사용된다. 그러므로 Fine tunning은 아래 레이어들의 파라미터는 고정을 시켜 놓고 상위 레이어들을 목적에 알맞게 갈아치워서 새롭게 변한 상위 레이어들의 파라미터만 학습하는 원리가 된다.
위 하단의 이미지로 보면 상단의 레이어들이 하위 레이어에 해당되고 하단의 레이어들이 상위 레이어에 해당된다.
예를 들면 수족관의 물고기들의 학습 이미지 데이터를 가지고 있고 사진을 찍었을때 물고기의 이름을 보여주는 앱을 개발하고 싶다고 하면 기존 분류 모델에 Fine tunning을 적용하면 간편하게 실현할 수 있다.
그럼 코드를 살펴 보자.
from keras.models import Model
from keras.layers import Dense,Flatten
from keras.applications import vgg16
# 입력의 이미지 사이즈는 상관없이 설정가능. 최소사이즈는 48x48x3
input_tensor = Input(shape=(150,150,3))
# include_top=False 가 포인트
vgg = vgg16.VGG16(input_tensor=input_tnesor, weights='imagenet', include_top=False)
# vgg = vgg16.VGG16(input_shape=(150,150,3), weights='imagenet', include_top=False)
# vgg 레이어에서 상위는 제거되었기에 아래는 하위 레이어를 의미
# 기존 파라미터가 새로운 학습에 의해 변경되지 않도록 한다.
for layer in vgg.layers:
layer.trainable = False
# 새로운 상위 레이어를 삽입
# 상위레이어가 제거되었기에 vgg.output은 하위 레이어의 출력 레이어를 의미
x = Flatten()(vgg.output)
prediction = Dense(10, activation='softmax')(x)
model = Model(inputs=vgg.input, outputs=prediction)
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(),
metrics=['accuracy'])
model.summary()
또는 좀 더 하위 레이어의 파라미터까지 파라미터를 갱신하길 원한다면
# block5_conv1 (Conv2D)
for layer in vgg.layers[:15]:
layer.trainable = False
# 확인
for i in model.layers:
print(i.name, i.trainable)
'data science > deep learning' 카테고리의 다른 글
바이너리 분류 모델에 있어서 평가 항목 (0) | 2024.01.16 |
---|---|
일반 데이터 학습용/테스트용 분리 (0) | 2024.01.14 |
학습 데이터 준비 (0) | 2024.01.02 |