TensorFlow 2 Quickstart for Beginners

학습 목표 매핑

SKALA 3기 Module 3 — ML/Deep Learning (Learning Objective 3-4)

  • Objective: TensorFlow/Keras Sequential API를 사용하여 신경망 이미지 분류 모델을 구축, 훈련, 평가할 수 있다 (Bloom L2-L3)
  • Evaluation: MNIST 또는 유사 데이터셋으로 전체 파이프라인 구현 가능 + 하이퍼파라미터 튜닝으로 정확도 개선

개요

이 튜토리얼은 10줄 코드로 신경망 이미지 분류기(MNIST 손글씨 숫자)를 구축하는 방법을 보여줍니다.

주요 컴포넌트:

  • TensorFlow 2.x (Eager execution)
  • Keras Sequential API (선형 스택 모델)
  • MNIST 데이터셋 (60,000 훈련, 10,000 테스트)
  • Adam Optimizer + SparseCategoricalCrossentropy Loss

7단계 완전한 파이프라인

1단계: 라이브러리 임포트 및 버전 확인

import tensorflow as tf
 
print("TensorFlow version:", tf.__version__)

출력 예시: TensorFlow version: 2.13.0

2단계: 데이터 로드 및 정규화

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# 정규화 (픽셀값 0-255 → 0-1)
x_train, x_test = x_train / 255.0, x_test / 255.0

데이터 통계:

  • 훈련 이미지: 60,000개 × 28×28 픽셀 (0-255 범위)
  • 테스트 이미지: 10,000개 × 28×28 픽셀
  • 클래스: 0-9 (10개 숫자)
  • 정규화 후: 0.0-1.0 범위 (그래디언트 계산 안정성)

3단계: 신경망 모델 구축

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),     # 입력층: 784 → 1D
    tf.keras.layers.Dense(128, activation='relu'),      # 은닉층: 128 뉴런 + ReLU
    tf.keras.layers.Dropout(0.2),                       # 정규화: 20% 드롭아웃
    tf.keras.layers.Dense(10)                           # 출력층: 10 클래스
])

아키텍처 분석:

입력출력활성화파라미터
Input28×28=784--0
Flatten784784없음0
Dense1784128ReLU784×128+128=100,480
Dropout128128-0 (훈련 중만)
Dense2(Output)12810없음128×10+10=1,290
Total---101,770

각 층의 역할:

  1. Flatten: 2D 이미지(28×28) → 1D 벡터(784)
  2. Dense(128, ‘relu’): 은닉층, ReLU로 비선형성 추가
  3. Dropout(0.2): 과적합 방지 (훈련 중 무작위로 20% 뉴런 비활성화)
  4. Dense(10): 출력층, 10개 클래스 (Softmax는 손실함수에 포함)

4단계: 모델 컴파일

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
 
model.compile(
    optimizer='adam',
    loss=loss_fn,
    metrics=['accuracy']
)

컴파일 설정 분석:

컴포넌트선택이유
OptimizerAdam적응형 학습률, 빠른 수렴, RMSprop + Momentum 결합
LossSparseCategoricalCrossentropy정수 라벨(0-9) 직접 입력 가능 (원-핫 인코딩 불필요)
from_logits=TrueTrue출력층이 Raw 로짓(pre-softmax) → Softmax 자동 적용
MetricsAccuracy훈련 모니터링용 (손실과 독립적)

5단계: 모델 훈련

history = model.fit(x_train, y_train, epochs=5)

훈련 결과 (Epoch별):

EpochLossAccuracy
10.295091.51%
20.133796.00%
30.101596.96%
40.085897.33%
50.075997.65%

학습 곡선 분석:

  • Epoch 1→2: 큰 폭 개선 (4.5%)
  • Epoch 2→5: 점진적 개선 (1.65%)
  • 안정화 추세: 5 epoch 후 수렴 근처

6단계: 모델 평가 (테스트 데이터)

test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=2)

테스트 결과:

  • Test Loss: 0.0743
  • Test Accuracy: 97.8%

훈련 vs 테스트 비교:

  • 훈련 정확도: 97.65%
  • 테스트 정확도: 97.80%
  • Gap: -0.15% (과적합 없음, 일반화 우수)

7단계: 예측 (확률 포함)

# Softmax 층 추가 (확률 출력)
probability_model = tf.keras.Sequential([
    model,
    tf.keras.layers.Softmax()
])
 
# 테스트 이미지 5개 예측
predictions = probability_model(x_test[:5])
 
print(predictions)
# 출력: 각 이미지에 대해 10개 클래스 확률

예측 출력 예시:

이미지예측 클래스최고 확률신뢰도
170.996매우 높음
220.998매우 높음
310.965높음
400.987매우 높음
540.991매우 높음

완전한 파이썬 코드 (복붙 가능)

import tensorflow as tf
 
# 1. 데이터 로드
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
 
# 2. 모델 구축
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10)
])
 
# 3. 컴파일
model.compile(
    optimizer='adam',
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
 
# 4. 훈련 (5 에포크)
model.fit(x_train, y_train, epochs=5)
 
# 5. 평가
test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=2)
print(f"Test Accuracy: {test_accuracy:.4f}")
 
# 6. 예측 (확률)
probability_model = tf.keras.Sequential([
    model,
    tf.keras.layers.Softmax()
])
predictions = probability_model(x_test[:5])
print(predictions)

핵심 개념 요약

개념설명SKALA 학습목표
Sequential API선형 스택 모델 (간단한 신경망)L2: 구조 이해
Flatten2D 이미지 → 1D 벡터 변환L2: 데이터 전처리
Dense완전 연결층 (모든 뉴런 연결)L2: 층의 역할
ReLU활성화 함수 (비선형성)L2: 활성화 선택
Dropout정규화 기법 (과적합 방지)L2: 정규화 개념
Adam적응형 최적화 알고리즘L2: 옵티마이저 선택
SparseCategoricalCrossentropy손실함수 (정수 라벨)L2: 손실함수 선택
Softmax확률 출력 (확률의 합=1)L2: 출력층 해석

학습 설계 포인트

Cognitive Level (Bloom)

  • L2 (Understand): 각 층의 역할, 하이퍼파라미터 이해
  • L3 (Apply): MNIST 또는 유사 데이터셋으로 코드 실행
  • L4 (Analyze): 훈련/테스트 곡선 분석, 과적합 진단

권장 실습 (Step-by-Step)

  1. 복붙 실행: 전체 코드 실행 → 97.8% 정확도 확인
  2. 파라미터 실험:
    • Dense 층 크기 변경: 128 → 64/256
    • Dropout 확률: 0.2 → 0.5
    • 에포크: 5 → 10/20
  3. 지표 추적:
    • Epoch별 손실/정확도 그래프 그리기
    • 테스트 정확도 최대화
  4. 심화 질문:
    • “Dropout 없으면 정확도가?” (과적합 확인)
    • “학습률 변경하면?” (수렴 속도)
    • “Dense(128) → Dense(256) → Dense(10) 추가 층?” (깊은 네트워크 효과)

다음 단계 (추천)

기초 강화 (L3-L4)

  • 새로운 데이터셋: Fashion-MNIST, CIFAR-10 등으로 모델 적응
  • 하이퍼파라미터 튜닝: GridSearchCV 또는 KerasTuner
  • 정규화 기법: L1/L2, Early Stopping, Batch Normalization 추가

고급 아키텍처 (L4-L5)

  • Functional API: Sequential 대신 유연한 모델 정의
  • CNN (Convo Neural Network): Conv2D 층으로 이미지 특징 추출
  • Transfer Learning: 사전훈련된 ResNet, VGG 활용

실전 팁

GPU 사용 확인:

print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))

모델 요약:

model.summary()  # 파라미터 수, 출력 형태 확인

저장 및 복원:

model.save('mnist_model.h5')  # 저장
loaded_model = tf.keras.models.load_model('mnist_model.h5')  # 복원

참고: Keras Sequential vs Functional API

특성SequentialFunctional
선형 아키텍처✅ (권장)⚠️ (과잉)
분기/병합
다중 입출력
복잡한 그래프
학습곡선낮음중간

선택 기준: MNIST 같은 간단한 문제 → Sequential ✓

타 소스와의 연계

neural-network-forward-backprop-tds (Forward/Backward 이론) backpropagation-step-by-step-mazur (그래디언트 계산 원리) random-forest-gradient-boosting-xgboost (트리 기반 vs 신경망 비교)

참고 자료