기존에는 CNN을 활용한 이미지 분류를 진행하였다면, 이번에는 전이학습을 통한 미세 조정 과정을 거친 모델 학습을 진행한다. Keras가 제공하는 여러 모델들 중 이미지 분류에 가장 많이 활용되는 것은 ResNet, VGG16 모델이다. 우선 ResNet 모델에 대하여 알아보자.
VGG 모델을 뼈대로 활용하여 더 깊은 신경망을 확보하는 방식의 모델이다.
사전 훈련된 ResNet이란 모델을 업로드하고, 여기에 Dense 층을 추가하여 모델을 변형하는 방식이다.
이미지 증강까지의 과정은 CNN 모델 학습 과정과 동일하다
RN50_2 = tf.keras.applications.resnet_v2.ResNet50V2(weights="imagenet",
include_top=False,
input_shape=(128, 128, 3))
RN50_2.trainable = False # 이미 학습된 가중치만을 사용
include_top을 False로 설정하면 이미지의 크기와 상관없이 이미 만들어진 레이어가 RN50_2라는 변수에 담기게 된다. 반대로 True인 경우에는 크기가 (128, 128, 3)으로 제한된다.
model = models.Sequential(name="ResNet50v2_RT")
model.add(RN50_2)
model.add(layers.Flatten())
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(5, activation = 'softmax'))
model.summary()
앞서 RN50_2 변수에 저장한 모델을 활용하여 모델을 다시 제작한다. 추가로 Dense layer를 추가하는 과정을 거쳐서 이미지 학습에 활용할 모델을 최종 완성하였다.
from tensorflow.keras import optimizers
model.compile(loss = 'categorical_crossentropy',
optimizer = optimizers.Adam(learning_rate = 0.00005),
metrics = ['accuracy'])
%%time
history = model.fit(train_generator,
steps_per_epoch = train_df.shape[0]//75,
epochs = 15,
validation_data = validation_generator,
validation_steps = test_df.shape[0]//75)
Epoch 1/15
27/27 [============] - 72s 3s/step - loss: 1.4445 - accuracy: 0.7175 - val_loss: 0.1741 - val_accuracy: 0.9333
Epoch 2/15
27/27 [============] - 70s 3s/step - loss: 0.2361 - accuracy: 0.9215 - val_loss: 0.1731 - val_accuracy: 0.9511
Epoch 3/15
27/27 [============] - 70s 3s/step - loss: 0.1459 - accuracy: 0.9432 - val_loss: 0.1441 - val_accuracy: 0.9467
.
.
.
Epoch 15/15
27/27 [============] - 74s 3s/step - loss: 0.0634 - accuracy: 0.9807 - val_loss: 0.0688 - val_accuracy: 0.9911
CPU times: total: 1h 2min 38s
Wall time: 18min 48s
정확도 면에서는 CNN과 마찬가지로 99%를 상회하는 높은 수치를 보였다. 다만 학습 시간은 약 5분 정도 늦는 결과가 나타났다.
# Test 데이터셋으로 성능 확인하기
test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_dataframe(test_df,
x_col='Filepath',
y_col='Label',
target_size=(128, 128),
batch_size=75)
loss, accuracy = model.evaluate(test_generator)
print('Loss = {:.5f}'.format(loss))
print('Accuracy = {:.5f}'.format(accuracy))
Found 250 validated image filenames belonging to 5 classes.
4/4 [==============] - 8s 2s/step - loss: 0.0076 - accuracy: 1.0000
Loss = 0.00758
Accuracy = 1.00000
model.save('ResNet_test.h5')
다음 포스팅은 VGG16을 활용한 모델 학습에 대하여 알아볼 예정이다.
github 주소 : https://github.com/Kihoon-Kwon/multiclass_ImageClassification.git