TensorFlow로 학습시킨 모델의 훈련 결과는 파이썬의 matplotlib 라이브러리를 활용해 손쉽게 시각화할 수 있습니다. 특히 plot() 메서드를 사용하면 에포크(epoch)별 정확도와 손실의 변화 추이를 그래프로 한눈에 확인할 수 있어, 모델의 학습 상태를 진단하는 데 매우 유용합니다.
사전 이해: Keras Sequential API와 CNN
이 예제는 Keras Sequential API를 사용합니다. Sequential 모델은 레이어를 순차적으로 쌓아 올리는 구조로, 각 레이어가 정확히 하나의 입력 텐서와 하나의 출력 텐서를 갖는 단순한 스택 형태의 모델을 만들 때 적합합니다.
합성곱 신경망(CNN, Convolutional Neural Network)은 최소 하나 이상의 합성곱 레이어(convolutional layer)를 포함하는 신경망으로, 이미지 분류와 같은 컴퓨터 비전 작업에서 뛰어난 성능을 발휘합니다. 본 예제에서도 CNN을 기반으로 학습 모델을 구축합니다.
예제 개요: 꽃 이미지 분류기
keras.Sequential 모델로 이미지 분류기를 생성하고, preprocessing.image_dataset_from_directory 유틸리티를 사용해 디스크에서 데이터를 효율적으로 불러옵니다. 또한 과대적합(overfitting)을 식별한 뒤, 데이터 증강(data augmentation)과 드롭아웃(dropout) 기법을 적용해 이를 완화하는 과정까지 다룹니다.
사용되는 데이터셋은 약 3,700장의 꽃 사진으로 구성되어 있으며, 클래스당 하나씩 총 5개의 하위 디렉터리로 나뉩니다. 각 클래스는 데이지(daisy), 민들레(dandelion), 장미(roses), 해바라기(sunflowers), 튤립(tulips)입니다.
실행 환경: Google Colaboratory
아래 코드는 Google Colaboratory(Colab)에서 실행됩니다. Colab은 브라우저에서 별도 설정 없이 바로 파이썬 코드를 실행할 수 있게 해주며, GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 큰 장점이 있습니다. Jupyter Notebook을 기반으로 만들어진 서비스입니다.
예제 코드
print("Calculating the accuracy")
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
print("Calculating the loss")
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(epochs)
print("The results are being visualized")
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()코드 출처 − https://www.tensorflow.org/tutorials/images/classification
출력 결과
Calculating the accuracy Calculating the loss The results are being visualized

결과 해석: 과대적합(Overfitting) 진단
- 위 그래프를 보면 훈련 정확도(training accuracy)와 검증 정확도(validation accuracy)가 서로 동조하지 않는 것을 확인할 수 있습니다.
- 모델은 검증 데이터셋에서 약 60% 수준의 정확도만 달성했습니다.
- 이러한 현상을 과대적합(overfitting)이라고 합니다.
- 훈련 정확도는 시간이 지남에 따라 선형적으로 계속 증가하는 반면, 검증 정확도는 훈련 과정에서 약 60% 부근에서 정체됩니다.
- 훈련 예시의 수가 적으면 모델이 훈련 데이터 속 잡음(noise)이나 불필요한 세부 정보까지 함께 학습하게 됩니다.
- 이는 새로운 예시에 대한 모델 성능에 부정적인 영향을 미칩니다.
- 과대적합으로 인해 모델은 새로운 데이터셋에 대해 잘 일반화(generalization)하지 못하게 됩니다.
- 과대적합을 방지하는 방법은 여러 가지가 있으며, 여기서는 데이터 증강(data augmentation)을 활용해 과대적합을 극복합니다.
참고로 데이터 증강 외에도 드롭아웃(dropout), 조기 종료(early stopping), L2 정규화 등의 기법을 함께 적용하면 과대적합을 더욱 효과적으로 완화할 수 있습니다. 훈련 결과를 반드시 시각화하여 확인하는 습관을 들이면, 모델이 과대적합에 빠졌는지 여부를 초기 단계에서 빠르게 판단할 수 있습니다.