[Home] Python으로 돌아가기

손글씨 숫자 분류

📖 목차

(1) 문제 정의

딥러닝을 활용하여 손글씨 숫자 이미지(MNIST 데이터셋)를 분류하는 모델을 구축한다. MNIST는 0부터 9까지의 손글씨 숫자 이미지(28x28 픽셀)로 구성된 대표적인 이미지 분류 데이터셋이다. 이 문제는 10개의 클래스를 분류하는 다중 클래스 분류 문제이다.

...
Visualization of the MNIST Test Dataset in the Deep Lake UI
출처: https://datasets.activeloop.ai/docs/ml/datasets/mnist/

(2) 머신러닝 파이프라인

1) 데이터 로딩

TensorFlow의 keras.datasets 모듈을 통해 MNIST 데이터를 로딩한다. 학습 데이터 60,000개와 테스트 데이터 10,000개로 구성되어 있으며, 각 데이터는 28x28 크기의 흑백 이미지이다. 이미지를 시각화하여 각 숫자의 라벨이 잘 매칭되는지 확인한다.

...
데이터와 라벨 샘플
출처: https://cleanlab.ai/blog/label-errors-image-datasets/
...
픽셀로 구성된 MNIST 숫자 데이터
각 이미지는 28x28 = 784 의 구조로 이루어져 있으며, 흑백 이미지이므로 한 개의 채널을 갖는다.
출처: https://hatchworks.com/blog/gen-ai/train-and-fine-tune-multimodal-model/
... ...
MNIST 이미지 데이터 세트
55000개의 Training set의 구조를 본다면, [55000, 784]의 tensor로 구성된다.
이들의 label의 구조는 [55000, 10] (0 ~ 9 의 숫자이므로) 으로 이루어진다.
출처: https://wikidocs.net/136667

2) 데이터 전처리

이미지 데이터를 정규화하기 위해 0 ~ 255의 픽셀 값을 0 ~ 1 사이로 스케일링한다. 또한 모델 입력 형식에 맞게 데이터를 reshape 하며, 라벨은 원-핫 인코딩 처리한다. CNN 모델에서는 이미지 차원을 (28, 28, 1)로 변경한다.

...
스케일링된 MNIST 이미지
출처: https://nesusws-tutorials-bd-dl.readthedocs.io/en/latest/hands-on/tensorflow/mnist/
...
MNIST 레이블 데이터 세트
출처: https://wikidocs.net/136667

3) 모델 구성 및 학습

딥러닝 모델로는 두 가지 방식을 사용한다.

CNN 모델은 Conv2D, MaxPooling2D, Flatten, Dense 계층으로 구성하고, Adam 옵티마이저와 categorical_crossentropy 손실 함수를 사용하여 학습한다.

그림 E10.5.3g 모델 구성 (출처: 위키독스) [LINK]

...
모델 구성
출처: https://wikidocs.net/165440

4) 예측 및 결과

테스트 데이터 중 하나를 선택하여 예측을 수행하고, 예측 결과를 이미지와 함께 시각화한다. 또한, 테스트 데이터 일부를 이용해 전체 정확도를 평가한다.


5) 성능 평가

학습된 CNN 모델의 정확도는 테스트 데이터에서 약 98% 이상임을 확인한다. Confusion Matrix와 Classification Report를 통해 클래스 별 정밀도와 재현율도 분석한다. 이로써 모델이 손글씨 숫자를 잘 분류함을 확인한다.


(3) 실행 결과

1) classification_report (분류 보고서)

■ 주요 메트릭 (metric)

• Precision

정확도. 특정 클래스(양성 등)로 예측된 값 중 실제로 해당 클래스인 비율. \[ \text{Precision} = \frac{TP}{TP + FP} \]

• Recall

재현율. 실제 해당 클래스 중 모델이 정확히 예측한 비율.

\[ \text{Recall} = \frac{TP}{TP + FN} \]

• F1-Score

Precision과 Recall의 조화 평균.

\[ \text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]

• Support

각 클래스의 실제 데이터 개수.

    Classification Report:
               precision    recall  f1-score   support

           0       0.98      1.00      0.99        42
           1       1.00      1.00      1.00        67
           2       0.98      0.98      0.98        55
           3       0.98      1.00      0.99        45
           4       1.00      1.00      1.00        55
           5       1.00      0.98      0.99        50
           6       1.00      0.98      0.99        43
           7       0.98      1.00      0.99        49
           8       1.00      0.97      0.99        40
           9       1.00      1.00      1.00        54

    accuracy                           0.99       500
    macro avg       0.99      0.99      0.99       500
    weighted avg       0.99      0.99      0.99       500
    

■ confusion_matrix (혼동 행렬)

행은 실제 클래스, 열은 예측 클래스이다.

Actual (실제) Predicted (예측)
Positive (긍정) Negative (부정)
Positive (긍정) TP FN
Negative (부정) FP TN

• True Positive (TP)

실제로 긍정이고 모델도 긍정으로 예측한 경우

• True Negative (TN)

실제로 부정이고 모델도 부정으로 예측한 경우

• False Positive (FP)

실제로 부정인데 모델이 긍정으로 잘못 예측한 경우 (Type I Error)

• False Negative (FN)

실제로 긍정인데 모델이 부정으로 잘못 예측한 경우 (Type II Error)

    Confusion Matrix:
    [[42  0  0  0  0  0  0  0  0  0]
     [ 0 67  0  0  0  0  0  0  0  0]
     [ 0  0 54  0  0  0  0  1  0  0]
     [ 0  0  0 45  0  0  0  0  0  0]
     [ 0  0  0  0 55  0  0  0  0  0]
     [ 0  0  0  1  0 49  0  0  0  0]
     [ 1  0  0  0  0  0 42  0  0  0]
     [ 0  0  0  0  0  0  0 49  0  0]
     [ 0  0  1  0  0  0  0  0 39  0]
     [ 0  0  0  0  0  0  0  0  0 54]]