왜 이 코드를 실행하나요? VGG19의 똑똑한 특징 추출 능력은 그대로 빌려오되, 우리가 가진 6가지 한식을 분류할 수 있도록 마지막 층만 새로 설계합니다. 처음에는 VGG의 가중치를 고정(trainable=False)하여 학습 효율을 높입니다.
from tensorflow.keras.applications.vgg19 import VGG19
model = VGG19(input_shape=(96, 96, 3), include_top=False, weights='imagenet')
# ImageNet으로 학습된 VGG19를 불러와요. (96x96 입력, 분류층 제외)
model.trainable = False
# 이미 배운 능력(가중치)은 변하지 않게 꽁꽁 잠가요.
t_model = tf.keras.models.Sequential([
# 새로운 순차적 모델을 시작해요.
model,
# 잠가놓은 VGG19를 첫 번째 특징 추출기로 넣어요.
tf.keras.layers.GlobalAveragePooling2D(),
# VGG가 뽑은 복잡한 특징맵을 평균내서 단순화해요.
tf.keras.layers.Dense(128, activation='relu'),
# 추출된 정보를 조합할 중간 지능 층을 추가해요.
tf.keras.layers.Dense(6, activation='softmax')
# 6가지 음식을 맞히는 마지막 출구를 만들어요.
])
# 전이학습용 학습 규칙(Adam 0.001)을 설정해요.
t_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
# 결합된 모델의 전체 지도를 그려봐요.
loss='categorical_crossentropy',
예상 출력
Model: "sequential"
_________________________________________________________________
vgg19 (Functional) (None, 3, 3, 512) 20024384
global_average_pooling2d (None, 512) 0
dense (None, 128) 65664
dense_1 (None, 6) 774
=================================================================
Total params: 20,090,822
Trainable params: 66,438
Non-trainable params: 20,024,384
출력 해설: 약 2,000만 개의 파라미터 중 우리가 추가한 6만 개만 학습 가능(Trainable)한 상태인 것을 확인해야 합니다.