CNN을 활용한 이미지 분류 모델 구현
1. CNN(Convolutional Neural Network) 개요
합성곱 신경망(Convolutional Neural Network, CNN)은 이미지와 같은 2차원 데이터의 패턴을 효과적으로 학습할 수 있도록 설계된 신경망입니다. CNN은 일반적으로 다음과 같은 계층을 포함합니다:
- 합성곱 층(Convolutional Layer): 이미지의 특징을 추출하는 계층
- 풀링 층(Pooling Layer): 특징 맵의 차원을 줄이고 중요한 정보를 유지하는 계층
- 완전 연결층(Fully Connected Layer): 추출된 특징을 바탕으로 최종 분류를 수행하는 계층
이번 포스팅에서는 CNN을 활용하여 이미지 분류 모델을 구축하는 방법을 단계별로 설명하겠습니다.
2. 데이터셋 준비 (CIFAR-10 활용)
CIFAR-10 데이터셋은 10개의 클래스로 구성된 60,000장의 컬러 이미지(32x32 픽셀)로 이루어져 있습니다. TensorFlow
의 keras.datasets
모듈을 이용하여 간단하게 가져올 수 있습니다.
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
# 데이터 로드 및 전처리
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 데이터 정규화 (0~1 범위로 조정)
x_train, x_test = x_train / 255.0, x_test / 255.0
# 레이블을 원-핫 인코딩으로 변환
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 데이터 시각화
def plot_sample_images(x, y):
fig, axes = plt.subplots(1, 5, figsize=(10, 5))
for i in range(5):
axes[i].imshow(x[i])
axes[i].set_title(f"Label: {y[i].argmax()}")
axes[i].axis('off')
plt.show()
plot_sample_images(x_train, y_train)
위 코드는 CIFAR-10 데이터를 로드한 후, 정규화하고 원-핫 인코딩을 적용하는 과정입니다. 또한, 일부 샘플 이미지를 출력하여 데이터의 구성을 확인할 수 있습니다.
3. CNN 모델 구현
CNN 모델을 구축하기 위해 tensorflow.keras
의 Sequential
API를 활용합니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# CNN 모델 정의
model = Sequential([
Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu', padding='same'),
MaxPooling2D((2, 2)),
Conv2D(128, (3, 3), activation='relu', padding='same'),
MaxPooling2D((2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(10, activation='softmax')
])
# 모델 요약
model.summary()
모델 구조 설명
- Conv2D 층: 3x3 필터를 사용하여 특징을 추출하며,
ReLU
활성화 함수를 사용합니다. - MaxPooling2D 층: 2x2 풀링을 통해 차원을 줄이고 계산량을 감소시킵니다.
- Flatten 층: CNN 층에서 추출된 특징을 1D 벡터로 변환합니다.
- Dense 층: Fully Connected Layer로, 128개의 뉴런을 사용합니다.
- Dropout 층: 과적합을 방지하기 위해 일부 뉴런을 랜덤하게 제외합니다.
- Softmax 출력층: 10개의 클래스에 대한 확률을 출력합니다.
4. 모델 컴파일 및 학습
모델을 학습시키기 위해 손실 함수, 옵티마이저, 평가지표를 설정한 후 훈련을 수행합니다.
# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 모델 학습
history = model.fit(x_train, y_train, epochs=20, batch_size=64, validation_data=(x_test, y_test))
하이퍼파라미터 설명
- 옵티마이저(Optimizer):
adam
을 사용하여 가중치를 업데이트합니다. - 손실 함수(Loss Function): 다중 클래스 분류이므로
categorical_crossentropy
를 사용합니다. - 평가지표(Metrics): 정확도(
accuracy
)를 사용하여 성능을 평가합니다.
5. 모델 평가 및 성능 분석
학습이 완료된 후 테스트 데이터에서 성능을 평가하고 학습 곡선을 시각화합니다.
# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"테스트 데이터 정확도: {test_acc:.4f}")
학습 곡선 시각화
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('CNN 모델 학습 곡선')
plt.show()
위 그래프를 통해 학습 과정에서 정확도가 어떻게 변화하는지 확인할 수 있습니다.
6. 모델 저장 및 활용
학습이 완료된 모델을 저장하여 나중에 다시 불러올 수 있습니다.
# 모델 저장
model.save('cnn_cifar10_model.h5')
# 저장된 모델 불러오기
from tensorflow.keras.models import load_model
saved_model = load_model('cnn_cifar10_model.h5')
이제 저장된 모델을 사용하여 새로운 이미지를 분류할 수 있습니다.
import numpy as np
def predict_image(img):
img = img.reshape(1, 32, 32, 3) / 255.0 # 정규화
prediction = saved_model.predict(img)
return np.argmax(prediction)
7. 결론
이번 포스팅에서는 CNN을 활용하여 CIFAR-10 데이터셋을 분류하는 모델을 구현하였습니다. CNN의 핵심 개념을 살펴보고, TensorFlow/Keras를 이용한 모델 구성, 학습, 평가, 저장 및 예측 과정을 다루었습니다.
'Python DeepLearning' 카테고리의 다른 글
LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)의 차이점 및 구현 (0) | 2025.04.20 |
---|---|
RNN(Recurrent Neural Network) 개념 및 구현 (0) | 2025.04.19 |
CNN(Convolutional Neural Network)의 개념 및 동작 원리 (0) | 2025.04.16 |
역전파 알고리즘(Backpropagation)과 손실 최소화 원리 (0) | 2025.04.15 |
다층 퍼셉트론(MLP) 모델 구현 (0) | 2025.04.14 |