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 클래스
])아키텍처 분석:
| 층 | 입력 | 출력 | 활성화 | 파라미터 |
|---|---|---|---|---|
| Input | 28×28=784 | - | - | 0 |
| Flatten | 784 | 784 | 없음 | 0 |
| Dense1 | 784 | 128 | ReLU | 784×128+128=100,480 |
| Dropout | 128 | 128 | - | 0 (훈련 중만) |
| Dense2(Output) | 128 | 10 | 없음 | 128×10+10=1,290 |
| Total | - | - | - | 101,770 |
각 층의 역할:
- Flatten: 2D 이미지(28×28) → 1D 벡터(784)
- Dense(128, ‘relu’): 은닉층, ReLU로 비선형성 추가
- Dropout(0.2): 과적합 방지 (훈련 중 무작위로 20% 뉴런 비활성화)
- Dense(10): 출력층, 10개 클래스 (Softmax는 손실함수에 포함)
4단계: 모델 컴파일
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(
optimizer='adam',
loss=loss_fn,
metrics=['accuracy']
)컴파일 설정 분석:
| 컴포넌트 | 선택 | 이유 |
|---|---|---|
| Optimizer | Adam | 적응형 학습률, 빠른 수렴, RMSprop + Momentum 결합 |
| Loss | SparseCategoricalCrossentropy | 정수 라벨(0-9) 직접 입력 가능 (원-핫 인코딩 불필요) |
| from_logits=True | True | 출력층이 Raw 로짓(pre-softmax) → Softmax 자동 적용 |
| Metrics | Accuracy | 훈련 모니터링용 (손실과 독립적) |
5단계: 모델 훈련
history = model.fit(x_train, y_train, epochs=5)훈련 결과 (Epoch별):
| Epoch | Loss | Accuracy |
|---|---|---|
| 1 | 0.2950 | 91.51% |
| 2 | 0.1337 | 96.00% |
| 3 | 0.1015 | 96.96% |
| 4 | 0.0858 | 97.33% |
| 5 | 0.0759 | 97.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개 클래스 확률예측 출력 예시:
| 이미지 | 예측 클래스 | 최고 확률 | 신뢰도 |
|---|---|---|---|
| 1 | 7 | 0.996 | 매우 높음 |
| 2 | 2 | 0.998 | 매우 높음 |
| 3 | 1 | 0.965 | 높음 |
| 4 | 0 | 0.987 | 매우 높음 |
| 5 | 4 | 0.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: 구조 이해 |
| Flatten | 2D 이미지 → 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)
- 복붙 실행: 전체 코드 실행 → 97.8% 정확도 확인
- 파라미터 실험:
- Dense 층 크기 변경: 128 → 64/256
- Dropout 확률: 0.2 → 0.5
- 에포크: 5 → 10/20
- 지표 추적:
- Epoch별 손실/정확도 그래프 그리기
- 테스트 정확도 최대화
- 심화 질문:
- “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
| 특성 | Sequential | Functional |
|---|---|---|
| 선형 아키텍처 | ✅ (권장) | ⚠️ (과잉) |
| 분기/병합 | ❌ | ✅ |
| 다중 입출력 | ❌ | ✅ |
| 복잡한 그래프 | ❌ | ✅ |
| 학습곡선 | 낮음 | 중간 |
선택 기준: MNIST 같은 간단한 문제 → Sequential ✓
타 소스와의 연계
neural-network-forward-backprop-tds (Forward/Backward 이론) backpropagation-step-by-step-mazur (그래디언트 계산 원리) random-forest-gradient-boosting-xgboost (트리 기반 vs 신경망 비교)
참고 자료
- TensorFlow 공식 튜토리얼: https://www.tensorflow.org/tutorials
- Keras 문서: https://keras.io/
- MNIST 벤치마크: http://yann.lecun.com/exdb/mnist/