안녕하세요, 오늘은 TensorFlow를 활용해서 손글씨 숫자 이미지 분류 모델을 만들어보겠습니다.
대표적인 딥러닝 입문 예제인 MNIST 데이터셋을 활용해, 0부터 9까지의 손글씨 숫자를 인식하는 간단한 신경망 모델을 구현해볼 예정입니다.
1. TensorFlow란?
TensorFlow는 구글에서 개발한 오픈소스 딥러닝 라이브러리로, 다양한 신경망 모델을 손쉽게 만들고 학습시킬 수 있게 도와줍니다. GPU 가속 지원도 잘 되어 있어 대규모 연산을 빠르게 처리할 수 있습니다.
이번 실습에서는 TensorFlow 안에 포함된 Keras 고수준 API를 사용해 모델을 구현합니다.
2. MNIST 데이터셋이란?
MNIST는 28x28 크기의 손글씨 숫자 이미지(흑백) 70,000장으로 구성된 데이터셋입니다.
- 훈련 데이터: 60,000장
- 테스트 데이터: 10,000장
각 이미지는 0~9까지 숫자 레이블이 붙어 있습니다.
딥러닝 기초를 배우는 데 가장 많이 쓰이는 예제 데이터셋이라고 보시면 됩니다.
1. 텐서 플로우 설치
pip install tensorflow
pip install matplotlib
결과를 확인하기 위해 시각화 라이브러리인 matplotlib 도 설치해주도록 합니다.
2. 전체 코드
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# 1. MNIST 데이터셋 불러오기
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 2. 데이터 전처리
# 픽셀 값을 0~1 사이로 정규화합니다.
train_images = train_images / 255.0
test_images = test_images / 255.0
# 3. 모델 구성
# 신경망 층을 순서대로 쌓아 모델을 만듭니다.
model = keras.Sequential([
# 28x28 픽셀의 2차원 이미지를 784개의 1차원 배열로 변환합니다.
keras.layers.Flatten(input_shape=(28, 28)),
# 128개의 노드를 가진 은닉층 (활성화 함수: ReLU)
keras.layers.Dense(128, activation='relu'),
# 10개의 노드를 가진 출력층 (0~9 숫자에 해당, 활성화 함수: Softmax)
# Softmax 함수는 각 노드의 출력 값을 확률로 변환하여, 총합이 1이 되도록 합니다.
keras.layers.Dense(10, activation='softmax')
])
# 4. 모델 컴파일
# 모델의 학습 과정을 설정합니다.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 5. 모델 훈련
# 훈련 데이터를 사용하여 모델을 학습시킵니다. (5번 반복)
model.fit(train_images, train_labels, epochs=5)
# 6. 정확도 평가
# 테스트 데이터를 사용하여 모델의 성능을 평가합니다.
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\n테스트 정확도: {test_acc}')
# 7. 예측하기
# 테스트 데이터의 첫 번째 이미지를 사용하여 예측합니다.
predictions = model.predict(test_images)
print(f'첫 번째 이미지 예측: {np.argmax(predictions[0])}')
print(f'첫 번째 이미지 실제 레이블: {test_labels[0]}')
# 첫 번째 테스트 이미지를 시각화하여 확인합니다.
plt.figure()
plt.imshow(test_images[0], cmap=plt.cm.binary)
plt.colorbar()
plt.grid(False)
plt.show()
모델 훈련이 끝나면, 콘솔에 에포크별 정확도(accuracy)와 손실(loss) 가 출력됩니다.
아래처럼 5번의 학습 후 약 97% 이상의 정확도를 확인할 수 있습니다.
실제 출력된 손글씨 숫자 ‘7’ 이미지 입니다.
이번 글에서는 TensorFlow를 활용해 간단한 신경망을 만들고, MNIST 손글씨 숫자 데이터셋으로 학습시켜, 97% 이상의 정확도를 얻는 과정을 살펴봤습니다. 이 예제는 딥러닝의 기초 개념(데이터 전처리, 모델 구성, 학습, 평가, 예측)을 배워볼 수 있는 아주 간단한 편에 속하는 예제 입니다 !
여기에 추가적으로 CNN(합성곱 신경망) 같은 더 복잡한 구조를 적용하면 98~99% 이상 정확도도 기대할 수 있습니다.
감사합니다.
'Python' 카테고리의 다른 글
[Python] Streamlit으로 대시보드 만들기 (0) | 2025.08.30 |
---|---|
[Python] 간단한 Attention 메커니즘 구현하기 (Query, Key, Value 이해하기) (3) | 2025.08.28 |
[Python] PyTorch 텐서 차원 다루기 (0) | 2025.08.26 |
[Python] gRPC로 양방향 통신하기 (0) | 2025.08.22 |
[Python] 음성 데이터 품질 검사(QC) 자동화 리포트 만들기 (0) | 2025.08.20 |