CNN을 활용한 이미지 분류 예제
이번 수업에서는 TensorFlow
와 Keras
를 활용하여 간단한 이미지 분류 모델을 구축하고, MNIST 데이터셋을 사용하여 숫자 이미지(0~9)를 분류하는 예제를 실습해 보겠습니다.
1. 데이터 준비
먼저 TensorFlow에서 제공하는 MNIST
데이터셋을 불러옵니다. 이 데이터셋은 28×28 크기의 손글씨 숫자 이미지로 구성되어 있습니다.
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# MNIST 데이터셋 불러오기
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 데이터를 0~1 범위로 정규화
x_train, x_test = x_train / 255.0, x_test / 255.0
# 차원 확장 (CNN은 3D 형태의 입력을 요구함)
x_train = x_train[..., np.newaxis]
x_test = x_test[..., np.newaxis]
# 데이터 샘플 출력
plt.imshow(x_train[0].squeeze(), cmap='gray')
plt.title(f"Label: {y_train[0]}")
plt.show()
2. CNN 모델 생성
CNN 모델은 합성곱 층(Conv2D), 풀링 층(MaxPooling2D), 그리고 완전 연결층(Dense)으로 구성됩니다.
# CNN 모델 정의
model = keras.Sequential([
keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D(2, 2),
keras.layers.Conv2D(64, (3,3), activation='relu'),
keras.layers.MaxPooling2D(2,2),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
# 모델 구조 출력
model.summary()
# 모델 컴파일
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
3. 모델 학습
준비된 데이터로 모델을 학습합니다.
# 모델 훈련
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
학습 과정에서 정확도와 손 실 값이 감소하는지를 확인할 수 있습니다.
4. 모델 평가 및 예측
학습된 모델을 평가하고, 예측을 수행해봅니다.
# 모델 평가
loss, acc = model.evaluate(x_test, y_test)
print(f"테스트 정확도: {acc:.4f}")
특정 샘플에 대한 예측을 수행하여 결과를 확인할 수 있습니다.
# 샘플 데이터 예측
sample = x_test[:5] # 첫 5개 이미지
predictions = model.predict(sample)
predicted_labels = np.argmax(predictions, axis=1)
# 예측 결과 출력
for i in range(5):
plt.imshow(sample[i].squeeze(), cmap='gray')
plt.title(f"예측: {predicted_labels[i]}, 실제: {y_test[i]}")
plt.show()
이제 CNN을 사용하여 손글씨 숫자 이미지 분류를 수행하는 간단한 모델을 만들었습니다.
모델을 다양한 이미지 데이터셋에 적용하면 더욱 성능이 뛰어난 이미지 분류 모델을 만들 수 있습니다.
다음 수업에서는 지금까지 배운 내용을 점검하는 간단한 퀴즈를 풀어보겠습니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!