본문 바로가기
C.W.K.
Stream
Lesson 05 of 07 · published

MNIST 분류기 만들기

~8 min · sequential

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

한 화면에 담긴 전체 학습 흐름

MNIST 손글씨 0~9 분류는 딥러닝의 오래된 첫 예제야. 데이터셋보다 중요한 점은 앞으로 만들 프로젝트 대부분이 따를 여섯 단계가 한 화면에 들어온다는 데 있어(전체 스크립트는 코드 블록 참고).

  1. 불러오기keras.datasets.mnist.load_data()가 학습·시험 데이터를 NumPy 배열로 돌려줘.
  2. 정규화 — 픽셀 값을 255로 나눠 [0, 1] 범위로 맞춰. 빠뜨리면 학습이 느리거나 불안정해질 수 있어.
  3. 모델 생성 — Flatten → Dense(relu) → Dropout → Dense(softmax) 순서로 Sequential 모델을 쌓아.
  4. 학습 설정adam 옵티마이저, 정수 레이블에 맞는 sparse_categorical_crossentropy, 관찰할 평가지표를 지정해.
  5. 학습fit()validation_split으로 암기가 아닌 일반화 성능을 확인해.
  6. 평가 — 학습에 쓰지 않은 시험 데이터로 최종 성능을 재.

다섯 에포크만 학습해도 시험 정확도는 보통 97~98%에 도달해. 주의할 곳은 손실 함수야. sparse_categorical_crossentropy3 같은 정수 레이블을 받고, categorical_crossentropy[0,0,0,1,0,...] 같은 원-핫 벡터를 기대해. 둘을 바꾸면 텐서 모양 오류가 나.

Code

MNIST 분류 전체 흐름: 불러오기 → 정규화 → 모델 생성 → 설정 → 학습 → 평가·python
import keras
from keras import layers

# 1. Load data
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2. Normalize pixel values to [0, 1]
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0

# 3. Build model
model = keras.Sequential([
    keras.Input(shape=(28, 28)),
    layers.Flatten(),
    layers.Dense(128, activation="relu"),
    layers.Dropout(0.2),
    layers.Dense(10, activation="softmax"),
])

# 4. Compile
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

# 5. Train
model.fit(x_train, y_train, epochs=5, validation_split=0.1)

# 6. Evaluate
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc:.4f}")  # ~97.5%

External links

Exercise

MNIST 분류기를 구현해 시험 정확도 97% 이상을 만들어. 그다음 손실 함수를 일부러 잘못된 'categorical_crossentropy'로 바꾸고 어떤 오류가 나는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.