📢 이미지넷 1,000개 카테고리로 학습된 VGG16 모델을 이용하여 개, 고양기 분류 모델을 만들어 보자!
데이터 불러오기
data = np.load('./data/np_cats_dogs.npz')
# 저장되어 있는 데이터 변수에 저장
X_train = data['X_train']
X_test = data['X_test']
y_train = data['y_train']
y_test = data['y_test']
모델 불러오기
# VGG16 모델 불러오기
from tensorflow.keras.applications import VGG16
모델 객체 생성
# 객체 생성
vgg16 = VGG16(include_top=False,
weights = 'imagenet',
input_shape = (224,224,3))include_topweightsinput_shape# 모델 정보 요약
vgg16.summary()vgg.summary() 
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten
from tensorflow.keras.optimizers import Adam
# 뼈대 생성
transfer_model = Sequential()
# feature extractor (VGG)
transfer_model.add(vgg16)
# classifier
transfer_model.add(Flatten())
transfer_model.add(Dense(units = 64, activation = 'relu'))
# ouptut layer
transfer_model.add(Dense(units = 1, activation = 'sigmoid'))
# 학습 방법 및 평가 방법 설정
transfer_model.compile(loss = 'binary_crossentrophy',
optimizer = Adam(),
metrics = ['accuracy'])
# 학습 <- skip
for layer in vgg16.layers:
layer.trainable = False # 모든 층의 가중치 업데이트 X (동결!)
h = transfer_model.fit(X_train, y_train,
validation_split = 0.2,
epochs = 10)

층이름.trainableTrue : 학습 가중치 업데이트 OFalse : 학습 가중치 업데이트 X (즉, 동결)마지막 합성곱 층 학습 가중치 업데이트 설정
# 미세조정
for layer in vgg16.layers:
if layer.name == 'block5_conv3':
layer.trainable = True # 학습 가중치 업데이트 O
else:
layer.trainable = False # 학습 가중치 업데이트 X (즉, 동결)
TrueFalse 로 바꿔주지 않으면, 모든 층의 가중치 업데이트 되어서 새로 학습해버림!True 를 설정해주고, 나머지에는 False 로 설정하기학습
h = transfer_model.fit(X_train, y_train,
validation_split = 0.2,
epochs = 10)
결과

성능 짱 좋아짐 ….
but 아직 과적합 ㅠㅠ → 이건 데이터 부족해서 그런 것. 데이터 증강시켜서 하면 괜찮아질 것 임!

기본 CNN 모델 대비, 성능 좋아짐 !!!!