Chapter 3: 5줄로 만드는 첫 AI - 손글씨 인식기¶
한 줄 요약: 복잡한 원리 몰라도 괜찮아. 일단 진짜 동작하는 AI를 만들어보자!
🎯 이 장에서 배우는 것¶
- [ ] 사전 학습된 모델을 불러와 사용할 수 있다
- [ ] 이미지 데이터를 머신러닝 모델에 입력할 수 있다
- [ ] 예측 결과를 해석하고 출력할 수 있다
- [ ] "학습"과 "예측"의 차이를 설명할 수 있다
💡 왜 이걸 배우나요?¶
일단 맛보기!¶
요리를 배울 때 처음부터 칼 가는 법, 불 조절하는 법을 배우면... 지루하잖아? 🥱
"일단 맛있는 거 먹어보자!"
이 장은 그런 철학이야. AI가 어떻게 학습하는지, 신경망이 뭔지 몰라도 돼. 일단 진짜 동작하는 AI를 5줄로 만들어보는 것이 목표야.
이런 경험을 하게 될 거야¶
너: (손글씨 이미지를 보여줌)
AI: "이건 7이야!"
너: "오... 진짜 맞췄네?! 어떻게 알았지?"
신기하지 않아? 컴퓨터가 손으로 쓴 숫자를 알아보다니!
이 장을 마치면¶
- "나도 AI 만들어봤다!"라고 말할 수 있어
- 머신러닝이 "마법"이 아니라 "도구"라는 걸 느끼게 돼
- 다음 장에서 배울 내용이 궁금해질 거야
📚 핵심 개념¶
개념 1: 머신러닝(Machine Learning)¶
비유로 시작: 머신러닝은 마치 "경험으로 배우는 것"과 같아요.
아기가 고양이와 강아지를 구분하는 법을 생각해봐: - 처음엔 다 "멍멍이!"라고 해 😅 - 부모님이 "아니야, 이건 고양이야"라고 알려줌 - 수십 번 반복 - 어느 순간, 처음 보는 고양이도 "고양이!"라고 맞춤
👶 아기의 학습:
[고양이 사진] → "강아지?" → ❌ 틀림 → 수정
[고양이 사진] → "고양이?" → ⭕ 맞음 → 강화
... (수백 번 반복) ...
[새로운 고양이] → "고양이!" → ⭕
🤖 머신러닝도 똑같아:
[숫자 이미지] → "5?" → ❌ 틀림 → 수정
[숫자 이미지] → "7!" → ⭕ 맞음 → 강화
... (수만 번 반복) ...
[새로운 손글씨] → "7!" → ⭕
정확히 말하면: 머신러닝은 데이터로부터 패턴을 학습하여, 새로운 데이터에 대해 예측하는 기술이에요.
예를 들어: - 스팸 메일 분류기: 수천 개의 스팸/정상 메일로 학습 → 새 메일이 스팸인지 예측 - 추천 시스템: 너의 시청 기록으로 학습 → 좋아할 영상 예측 - 오늘 만들 것: 손글씨 숫자로 학습 → 새 손글씨가 몇인지 예측
쉽게 말하면: 컴퓨터가 예제를 보고 스스로 규칙을 찾아내는 것!
개념 2: 학습(Training) vs 예측(Prediction)¶
비유로 시작: 수능 준비와 비슷해!
📚 학습(Training) = 수능 공부
- 기출문제 1000개 풀기
- 해설 보면서 패턴 익히기
- 시간 오래 걸림 (몇 달~몇 년)
✏️ 예측(Prediction) = 수능 당일
- 처음 보는 문제
- 배운 패턴으로 답 추론
- 빠르게 답 내기 (몇 초)
정확히 말하면: - 학습(Training): 데이터를 보여주며 모델이 패턴을 익히는 과정 - 예측(Prediction): 학습된 모델이 새 데이터의 답을 맞추는 과정
예를 들어:
| 단계 | 손글씨 인식기 |
|---|---|
| 학습 | 6만 장의 손글씨 이미지를 보며 "이건 0, 이건 1, ..." 패턴 학습 |
| 예측 | 네가 그린 새 손글씨를 보고 "이건 7!" |
쉽게 말하면: 학습은 공부, 예측은 시험!
개념 3: 사전 학습된 모델(Pre-trained Model)¶
비유로 시작: 마치 "이미 훈련받은 전문가를 고용하는 것"과 같아요.
❌ 직접 학습시키기:
"강아지 훈련사 되기"
→ 3년 학원 + 실습 + 자격증
→ 그제야 강아지 훈련 가능
⭕ 사전 학습된 모델 쓰기:
"전문 훈련사 부르기"
→ 전화 한 통
→ 바로 강아지 훈련 가능
정확히 말하면: 누군가 이미 대량의 데이터로 학습시켜 놓은 모델을 가져다 쓰는 것이에요.
예를 들어: - 우리가 쓸 모델: 6만 장의 손글씨로 이미 학습 완료 - 학습에 걸린 시간: 수 시간 - 우리가 쓰는 시간: 1초 (불러오기만 하면 끝!)
쉽게 말하면: 남이 공부해놓은 걸 빌려 쓰는 것! (정당하게! 😄)
개념 4: MNIST 데이터셋¶
비유로 시작: 머신러닝계의 "Hello, World!" 같은 존재야.
프로그래밍 배울 때 첫 코드가 "Hello, World!"인 것처럼, 머신러닝 배울 때 첫 데이터셋이 MNIST야.
정확히 말하면: MNIST는 0~9 손글씨 숫자 이미지 7만 장으로 이루어진 데이터셋이에요.
MNIST 데이터셋 구성:
┌─────────────────────────────────────┐
│ 학습용 (Training): 60,000장 │
│ 테스트용 (Test): 10,000장 │
│ │
│ 이미지 크기: 28 x 28 픽셀 │
│ 색상: 흑백 (0~255) │
│ 숫자: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 │
└─────────────────────────────────────┘
예를 들어:
MNIST 이미지 예시 (28x28 픽셀):
"7"이라고 적힌 이미지:
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□■■■■■■■■■□□□□□□□□□□□□
□□□□□□□□□□□□□□■■□□□□□□□□□□□□
□□□□□□□□□□□□□■■□□□□□□□□□□□□□
□□□□□□□□□□□□■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■□□□□□□□□□□□□□□□
□□□□□□□□□□■■□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□□□□□□□□□□
□□□□□□□□□■■□□□□□□□□□□□□□□□□□
□□□□□□□□□■□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
쉽게 말하면: 전 세계 머신러닝 입문자가 사용하는 "국민 데이터셋"!
🔨 따라하기¶
Step 0: 새 노트북 만들기¶
목표: 이 장 실습을 위한 새로운 Colab 노트북을 생성해요.
- Google Colab 접속
- "새 노트" 클릭
- 제목을 "Chapter03_첫AI_손글씨인식"으로 변경
┌─────────────────────────────────────────────┐
│ Chapter03_첫AI_손글씨인식.ipynb │
├─────────────────────────────────────────────┤
│ + 코드 + 텍스트 │
│ │
│ [ 여기에 코드를 입력하세요 ] │
│ │
└─────────────────────────────────────────────┘
준비 완료! 이제 본격적으로 시작해보자! 🚀
Step 1: 도구 불러오기 (1줄)¶
목표: AI를 만드는 데 필요한 도구들을 가져와요.
코드:
# === WHAT: 머신러닝에 필요한 도구들을 불러오기 ===
# scikit-learn: 머신러닝 라이브러리 (사이킷런이라고 읽어)
# datasets: 유명한 데이터셋 모음
# RandomForestClassifier: 분류를 잘하는 머신러닝 모델
from sklearn.datasets import load_digits # 손글씨 숫자 데이터
from sklearn.ensemble import RandomForestClassifier # AI 모델
Shift + Enter로 실행해봐!
실행 결과:
(아무것도 출력되지 않으면 성공!)
여기서 잠깐! 🤔
"아무것도 안 나오는데 된 거야?"
응! 도구를 불러오는 코드는 보통 조용히 실행돼. 에러 메시지가 없으면 성공이야!
from sklearn.datasets import load_digits
이 코드의 의미:
┌──────────────────────────────────────────────┐
│ from sklearn.datasets │
│ → sklearn 라이브러리의 datasets에서 │
│ │
│ import load_digits │
│ → load_digits라는 기능을 가져와 │
│ │
│ 마치 "공구함에서 드라이버 꺼내기"와 같아! │
└──────────────────────────────────────────────┘
Step 2: 데이터 준비하기 (1줄)¶
목표: 손글씨 숫자 데이터를 불러와요.
코드:
# === WHAT: 손글씨 숫자 데이터 불러오기 ===
# --- WHY: AI를 학습시키려면 데이터가 필요하니까! ---
digits = load_digits() # 1797개의 손글씨 숫자 이미지 로드
실행 결과:
(역시 조용히 성공!)
여기서 잠깐! 🤔
"load_digits()가 뭐야? MNIST 아니었어?"
좋은 질문이야! load_digits()는 MNIST의 작은 버전이야.
| 구분 | MNIST | load_digits |
|---|---|---|
| 이미지 수 | 70,000장 | 1,797장 |
| 이미지 크기 | 28×28 | 8×8 |
| 용도 | 실제 연구 | 학습/연습 |
| 로딩 시간 | 수 초 | 즉시 |
우리는 입문용으로 가볍고 빠른 load_digits()를 쓸 거야!
데이터 구조 살펴보기: ```python
이 코드를 추가로 실행해서 데이터를 확인해봐!¶
print(f"이미지 개수: {len(digits.images)}개") print(f"이