콘텐츠로 이동

10차시: CIFAR-10 실전 프로젝트와 AI의 미래 - 종합 발표

⏰ 80분 · CIFAR-10 · 전이학습 · 프로젝트 발표 · AI 윤리 · 난이도 ●●●●○

학습목표: CIFAR-10 컬러 이미지에 CNN을 적용해 성능을 개선하고, 전이학습으로 사전학습 모델을 활용하며, 10차시 전 과정을 통합해 자신의 탐구 결과를 발표합니다.

오늘의 질문: “9차시 동안 만든 여러분의 AI는, 이 세상에 어떤 이야기를 들려주고 싶어 합니까?”


흑백 숫자에서 컬러 사물로. 그리고 ‘거인의 어깨’에 올라타는 법.

사전학습 모델을 불러와 10분 만에 80% 정확도를 넘기는 경험.

하이퍼파라미터 선택의 근거를 말로 설명하며 내 실험을 돌아봅니다.

내가 만들고 싶은 AI는 무엇이며, 어떤 책임이 따릅니까?


1단계: CIFAR-10 맛보기 + CNN 재적용 (15분)

섹션 제목: “1단계: CIFAR-10 맛보기 + CNN 재적용 (15분)”

MNIST와 달라진 점을 직접 눈으로 확인하고, 9차시에서 만든 CNN을 CIFAR-10에 붙여 봅니다. 정확도가 뚝 떨어지는 것을 경험하며 “왜 어려워졌는가”를 질문합니다.

2단계: 전이학습 개념과 MobileNetV2 실습 (20분)

섹션 제목: “2단계: 전이학습 개념과 MobileNetV2 실습 (20분)”

“거인의 어깨” 비유로 전이학습을 이해하고, MobileNetV2 사전학습 가중치를 가져와 최종 레이어만 학습합니다.

3단계: 하이퍼파라미터 튜닝 + 결과 정리 (15분)

섹션 제목: “3단계: 하이퍼파라미터 튜닝 + 결과 정리 (15분)”

학습률, 에폭, Augmentation 강도를 조정하며 베스트 모델을 찾고, 결과를 발표용 표로 정리합니다.

4단계: 3분 프로젝트 발표 & 동료 리뷰 (20분)

섹션 제목: “4단계: 3분 프로젝트 발표 & 동료 리뷰 (20분)”

각자 실험 결과와 선택 근거를 3분씩 발표하고, 동료에게 한 줄 피드백을 남깁니다.

5단계: ‘AI의 미래’ 성찰 에세이 (10분)

섹션 제목: “5단계: ‘AI의 미래’ 성찰 에세이 (10분)”

1차시의 힌튼·하사비스 이야기를 꺼내 “내가 만들고 싶은 AI”를 10문장 에세이로 정리합니다.


1. CIFAR-10: 컬러 세상으로의 진입

섹션 제목: “1. CIFAR-10: 컬러 세상으로의 진입”

MNIST가 ‘초등학교 받아쓰기 시험’이었다면, CIFAR-10은 ‘거리에서 사물 알아맞히기’입니다. 크기는 32×32로 여전히 작지만, 3채널 컬러에 배경·각도·조명이 제각각입니다. 같은 ‘고양이’라도 검은 고양이, 흰 고양이, 누워 있는 고양이, 뛰는 고양이가 섞여 있습니다.

CIFAR-10은 10개 클래스(비행기, 자동차, 새, 고양이, 사슴, 개, 개구리, 말, 배, 트럭)의 컬러 이미지 60,000장으로 구성된 데이터셋입니다. MNIST CNN을 그대로 붙이면 보통 65-72% 정도의 정확도에 머뭅니다.

항목MNISTCIFAR-10
이미지 크기28×28×1 (흑백)32×32×3 (컬러)
클래스 수10 (숫자)10 (사물)
학습 샘플60,00050,000
사람 정확도약 99.8%약 94%
기본 CNN 성능약 99%약 70%
# Python 3.10+, TensorFlow 2.x
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
import matplotlib.pyplot as plt
# CIFAR-10 로드: x는 (32,32,3) 컬러, y는 0-9 라벨
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
class_names = ['비행기','자동차','','고양이','사슴',
'','개구리','','','트럭']
# 왜 9장만 보나? 데이터의 다양성을 직관적으로 체감하기 위함
plt.figure(figsize=(8,8))
for i in range(9):
plt.subplot(3,3,i+1)
plt.imshow(x_train[i]) # <- 여기가 32x32 컬러 이미지
plt.title(class_names[y_train[i][0]])
plt.axis('off')
plt.show()
print("학습 데이터 shape:", x_train.shape)
print("픽셀 범위:", x_train.min(), "-", x_train.max())
학습 데이터 shape: (50000, 32, 32, 3)
픽셀 범위: 0 - 255

위 코드의 5번째 줄 cifar10.load_data()가 바로 CIFAR-10 데이터를 가져오는 부분이고, 11번째 줄 x_train[i]의 shape이 (32,32,3)인 것이 MNIST의 (28,28)과 결정적으로 다른 지점입니다. 채널이 3개라는 것은, CNN이 학습해야 할 정보량이 3배가 된다는 뜻입니다.

2. 베이스라인 CNN — 왜 성능이 떨어지는가

섹션 제목: “2. 베이스라인 CNN — 왜 성능이 떨어지는가”

9차시에서 만들었던 CNN을 CIFAR-10에 그대로 붙여 봅니다.

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 왜 255로 나누나? 픽셀 값을 0-1로 정규화하면 학습이 안정됩니다
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# v1: MNIST에서 썼던 구조를 그대로 이식
model_v1 = models.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, (3,3), activation='relu'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax') # <- 여기가 10클래스 분류
])
model_v1.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history_v1 = model_v1.fit(x_train, y_train, epochs=5,
validation_data=(x_test, y_test), verbose=2)
Epoch 5/5
1563/1563 - 18s - loss: 0.8421 - accuracy: 0.7042 - val_loss: 0.9731 - val_accuracy: 0.6688

훈련 70%, 검증 67%. MNIST의 99%와 비교하면 처참한 수치입니다. 이유는 두 가지입니다. 첫째, 컬러 + 배경 변동으로 학습해야 할 패턴의 복잡도가 폭증했습니다. 둘째, 모델이 데이터에 비해 너무 단순합니다. 여기서 세 가지 선택지가 있습니다.

  1. 모델을 더 깊게 쌓는다 (시간·컴퓨팅 비용↑)
  2. Augmentation + Dropout으로 일반화 강화 (9차시에서 배운 기법)
  3. 이미 똑똑한 남의 모델을 빌려온다 — 바로 전이학습

3. 전이학습(Transfer Learning) — 거인의 어깨

섹션 제목: “3. 전이학습(Transfer Learning) — 거인의 어깨”

한국사 시험 공부를 처음 하는 친구가 있다고 합시다. 아무것도 모르는 상태에서 시작하는 것과, 이미 세계사를 마스터한 친구의 노트를 빌려 한국사 부분만 추가로 외우는 것 — 당연히 후자가 빠릅니다. 세계사 지식이 한국사를 이해하는 데 쓸모 있기 때문입니다.

전이학습은 ImageNet(1,400만 장)으로 오래 학습된 거대 모델의 가중치를 가져와, 마지막 분류 레이어만 내 데이터에 맞게 다시 학습시키는 기법입니다. 앞단의 합성곱 필터들이 이미 “가장자리, 질감, 패턴”을 잘 뽑아내는 상태이기 때문에, 우리는 그 위에 작은 분류기만 얹으면 됩니다.

flowchart LR
    A[ImageNet<br/>1400만장 학습] --> B[MobileNetV2<br/>사전학습 가중치]
    B --> C[필터 고정<br/>freeze]
    C --> D[분류 레이어만<br/>새로 학습]
    D --> E[CIFAR-10<br/>80%+ 정확도]

사전학습 모델의 필터는 그대로 두고(freeze), 뒤에 붙인 Dense 레이어만 학습시키는 것이 핵심입니다.

방식학습 시간필요 데이터예상 정확도
처음부터 학습매우 김 (수시간)많이 필요70-85%
전이학습 (freeze)짧음 (5-10분)적게도 가능80-90%
전이학습 + fine-tuning중간중간85-93%

4. MobileNetV2로 10분 안에 80% 넘기기

섹션 제목: “4. MobileNetV2로 10분 안에 80% 넘기기”

v2에서는 MobileNetV2 사전학습 모델을 가져와 전이학습을 적용합니다. MobileNetV2는 모바일 기기용으로 가볍게 설계된 모델이라 코랩에서도 빠르게 돕니다.

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# v2: MobileNetV2는 최소 입력이 96x96이므로 32x32를 리사이즈해야 함
# 이것이 전이학습의 첫 관문: 내 데이터 모양을 남의 모델에 맞춰주기
def resize_images(images):
return tf.image.resize(images, [96, 96])
# 사전학습 모델 로드: weights='imagenet'이 핵심 (거인의 어깨)
base_model = MobileNetV2(
input_shape=(96, 96, 3),
include_top=False, # <- 여기: 원래 1000클래스 분류기는 버림
weights='imagenet' # <- 여기가 '거인의 어깨' 가중치
)
base_model.trainable = False # <- 여기가 freeze (필터 고정)
# 내 분류기 쌓기
model_v2 = models.Sequential([
layers.Lambda(resize_images, input_shape=(32,32,3)),
base_model,
layers.GlobalAveragePooling2D(),
layers.Dropout(0.3),
layers.Dense(10, activation='softmax')
])
model_v2.compile(optimizer=tf.keras.optimizers.Adam(1e-3),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history_v2 = model_v2.fit(x_train, y_train, epochs=5,
validation_data=(x_test, y_test),
batch_size=128, verbose=2)
Epoch 5/5
391/391 - 42s - loss: 0.5123 - accuracy: 0.8234 - val_loss: 0.5891 - val_accuracy: 0.8012

같은 5 에폭, 검증 정확도가 67% → 80%로 13%p 상승했습니다. 위 코드 17번째 줄 weights='imagenet'이 바로 전이학습의 핵심이며, 20번째 줄 base_model.trainable = False가 남의 지식을 그대로 쓰겠다는 선언입니다.

flowchart TB
    A[입력 32x32x3] --> B[리사이즈 96x96x3]
    B --> C[MobileNetV2<br/>필터 freeze]
    C --> D[GlobalAvgPool]
    D --> E[Dropout 0.3]
    E --> F[Dense 10<br/>softmax]
    F --> G[예측]

🔧 실습 활동: 나만의 모델 튜닝 & 발표 준비

섹션 제목: “🔧 실습 활동: 나만의 모델 튜닝 & 발표 준비”

v2 코드의 Adam(1e-3)1e-4, 5e-4, 1e-3, 3e-3 네 가지로 바꾸며 검증 정확도를 기록합니다. 어떤 값이 가장 좋았습니까?

layers.RandomFlip("horizontal"), layers.RandomRotation(0.1)을 Lambda 다음에 끼워 넣고 재학습합니다. 좌우반전이 ‘비행기’에는 좋지만 ‘숫자 6’에는 왜 나쁜지 생각하며 결과를 봅니다.

아래 표를 완성해 다음 발표에 가져갑니다.

실험 번호학습률DropoutAugmentationVal Accuracy한 줄 소감
1 (baseline)1e-30.3없음
2
3
베스트

에러 경험: 이 코드는 왜 터질까?

섹션 제목: “에러 경험: 이 코드는 왜 터질까?”
# 일부러 틀린 코드 — 실행하면 어떤 에러가 날까요?
base_model = MobileNetV2(
input_shape=(32, 32, 3),
include_top=False,
weights='imagenet'
)
ValueError: Input size must be at least 32x32; Received: input_shape=(32, 32, 3)
... (실제 에러) ...
ValueError: `input_shape` must be at least (96, 96, 3) for MobileNetV2 with weights='imagenet'

원인: ImageNet 사전학습 가중치는 최소 96×96 입력을 기대합니다. CIFAR-10의 32×32를 그대로 넣으면 가중치가 맞지 않습니다. 해결: tf.image.resize로 96×96로 리사이즈한 뒤 넣거나, weights=None으로 받아 처음부터 학습하거나(단, 이러면 전이학습이 아님).


활동 유형: 모둠(4인) → 개인 발표 3분 × 4명 + 상호 리뷰

발표 구조 (3분)

  1. 문제 정의 (30초): 내가 푼 문제는 무엇인가
  2. 실험 요약 (60초): 표로 정리한 결과 중 주요 2-3가지
  3. 선택의 근거 (60초): 왜 이 하이퍼파라미터를 골랐는가
  4. 배운 점 (30초): 예상과 달랐던 한 가지

동료 리뷰 카드

항목내 기록
발표자 이름
가장 인상 깊은 선택
더 실험해봤으면 하는 것
궁금한 질문 한 가지

💭 ‘AI의 미래’ 10분 에세이 (10분)

섹션 제목: “💭 ‘AI의 미래’ 10분 에세이 (10분)”

1차시에서 만난 두 인물을 기억합니까. 딥러닝의 기반을 닦은 제프리 힌튼은 2023년 구글을 떠나며 “AI의 위험을 자유롭게 말하기 위해”라고 했습니다. AlphaGo와 AlphaFold를 만든 데미스 하사비스는 “AI로 과학의 속도를 10배 빠르게 만드는 것”을 목표로 말합니다. 같은 기술을 보는 두 시선입니다.

여러분은 10차시 동안 퍼셉트론 한 개에서 전이학습까지 달려왔습니다. 이제 내 차례로 대답할 시간입니다.

에세이 질문 (아래 3개에 모두 답하기, 총 10-15문장)

  1. 내가 10차시 동안 만든 모델 중 가장 인상 깊었던 것은 무엇이고, 왜 그랬습니까?
  2. 5년 뒤 내가 만들고 싶은 AI는 무엇을 해결하는 도구입니까? 그 AI가 ‘절대 해서는 안 되는 일’은 무엇입니까?
  3. 힌튼의 걱정과 하사비스의 희망 사이에서, 나는 어느 쪽에 더 가깝습니까? 이유는 무엇입니까?

!!! note “에세이 작성 가이드”!!! note “에세이 작성 가이드” 추상적인 “좋은 AI”가 아니라 구체적인 대상을 떠올리세요. “시각장애인을 위한 길 안내 AI”, “멸종위기종 자동 판별 AI”처럼 누가·무엇을·왜 사용하는지가 드러나야 합니다.

에세이 워크시트

항목내 답변
가장 인상 깊었던 모델
그 이유 (1문장)
내가 만들고 싶은 AI 한 줄 정의
이 AI가 돕는 사람
절대 해서는 안 되는 일
나는 힌튼 쪽 / 하사비스 쪽
그 이유

10차시 동안 여러분이 지나온 길을 표로 정리합니다. 이 표는 발표와 에세이를 쓸 때 “내가 뭘 배웠는지” 떠올리는 지도로 쓰세요.

차시핵심 개념만든 것
1AI의 역사와 인물개념 지도
2퍼셉트론AND/OR 분류기
3다층 퍼셉트론XOR 해결
4경사하강법손실 감소 시각화
5역전파학습되는 MLP
6활성화 함수ReLU 비교 실험
7옵티마이저Adam vs SGD
8MNIST + Dropout숫자 분류 98%
9CNN + Augmentation손글씨 CNN 99%
10CIFAR-10 + 전이학습사물 분류 80%+


🛠️ 실무에서는 이렇게 씁니다

섹션 제목: “🛠️ 실무에서는 이렇게 씁니다”

오늘 배운 전이학습은 AI 실무의 기본 중의 기본입니다.

  • 의료 영상 진단: ImageNet으로 학습된 ResNet을 가져와 X-ray 1,000장으로 폐렴 진단 모델을 만듭니다. 병원은 수백만 장의 데이터를 모을 수 없기 때문에 전이학습은 필수입니다.
  • 제조업 불량 검출: 공장에서 찍은 부품 이미지 수백 장으로 EfficientNet을 fine-tuning해 불량품을 자동 분류합니다.
  • 스마트폰 카메라: 여러분 폰의 “음식 자동 인식”은 MobileNet 계열이 돌아갑니다. 오늘 쓴 그 모델입니다.
  • 자율주행: 실제 자율주행 회사의 인식 모델도 대규모 사전학습 → 자사 데이터로 fine-tuning 구조입니다.

즉, 오늘 10분 만에 80%를 찍은 그 파이프라인이 바로 실무의 표준 레시피입니다.


객관식 1. CIFAR-10에 MNIST용 CNN을 그대로 적용했을 때 정확도가 크게 떨어지는 가장 큰 이유는 무엇입니까?

① 클래스 개수가 너무 많아서 ② 이미지가 3채널 컬러이고 배경·각도 변동이 커 패턴 복잡도가 높아서 ③ 이미지 크기가 더 작아서 ④ 학습 데이터 개수가 부족해서

정답 확인

정답: ② MNIST와 CIFAR-10 모두 10클래스이고 학습 샘플 수도 비슷합니다. 결정적 차이는 컬러 채널과 배경·조명·각도 다양성에서 오는 패턴 복잡도입니다. ①은 사실이 아니고, ③은 오히려 32×32로 더 큽니다.

객관식 2. 전이학습에서 base_model.trainable = False로 설정하는 이유로 가장 적절한 것은 무엇입니까?

① 모델 파일 크기를 줄이기 위해 ② 사전학습된 필터를 보존하고, 위에 붙인 분류기만 학습시키기 위해 ③ 정확도를 일부러 낮추기 위해 ④ GPU 메모리가 부족할 때만 쓰는 설정

정답 확인

정답: ② ImageNet에서 이미 학습된 저수준/중수준 특징(가장자리·질감·부품)을 망가뜨리지 않고 그대로 쓰기 위해 필터를 ‘얼립니다(freeze)’. 이렇게 하면 적은 데이터로도 빠르게 좋은 성능을 얻습니다.

객관식 3. MobileNetV2에 weights='imagenet', input_shape=(32, 32, 3)으로 넣으면 어떤 에러가 발생합니까?

① OutOfMemoryError ② ValueError: input_shape은 최소 (96, 96, 3) 이상이어야 함 ③ TypeError: weights는 문자열이어야 함 ④ 에러 없이 정상 작동

정답 확인

정답: ② ImageNet 사전학습 가중치는 최소 96×96 입력에 맞춰 학습되어 있어, 그보다 작은 크기는 허용하지 않습니다. tf.image.resize로 크기를 키워서 넣어야 합니다.

서술형 1. 여러분이 “반려동물 품종 자동 분류 앱”을 만드려고 합니다. 학습 데이터는 2,000장뿐입니다. 처음부터 CNN을 쌓지 않고 전이학습을 택해야 하는 이유를 3가지 근거로 서술하세요.

예시 답안

첫째, 데이터 부족입니다. 처음부터 학습하려면 보통 수만~수십만 장이 필요하지만, 2,000장은 깊은 네트워크를 학습시키기에 턱없이 부족해 과적합이 필연입니다. 전이학습은 ImageNet의 1,400만 장에서 이미 일반적 시각 특징을 학습한 필터를 재사용하므로 적은 데이터로도 일반화가 가능합니다.

둘째, 학습 시간과 비용입니다. 처음부터 학습하면 수 시간에서 수 일이 걸리지만, 전이학습은 마지막 분류 레이어만 학습하므로 몇 분~십여 분이면 충분합니다. 앱 개발 주기상 빠른 반복이 가능해집니다.

셋째, 성능 상한입니다. 소규모 데이터에서 처음부터 학습한 모델은 보통 60-75%에서 멈추지만, 전이학습은 같은 데이터로도 85% 이상을 노릴 수 있습니다. 이미 반려동물 이미지와 비슷한 수백만 장의 동물·사물에서 패턴을 뽑는 법을 배운 모델이기 때문입니다.

자기점검 체크리스트

  • CIFAR-10이 MNIST보다 왜 어려운지 한 문장으로 설명할 수 있다
  • MobileNetV2 사전학습 모델을 불러와 CIFAR-10에 적용할 수 있다
  • 전이학습에서 freeze의 의미와 필요성을 말할 수 있다
  • 내 실험 결과를 표로 정리하고 하이퍼파라미터 선택의 근거를 3분간 설명할 수 있다
  • ‘내가 만들고 싶은 AI’에 대한 나의 입장을 글로 쓸 수 있다

아래 질문에 자유롭게 답하며 긴 여정을 마무리하세요.

  • 10차시 전체에서 가장 “아!” 했던 순간은 언제입니까? 그때 무엇을 이해했습니까?
  • 지금 시점에서 가장 헷갈리는 개념은 무엇입니까? 어떻게 더 공부할 계획입니까?
  • 1차시 첫 시간의 나와 오늘의 나를 비교하면, 무엇이 달라졌습니까?
  • AI를 공부하기 전에는 AI에 대해 어떤 이미지를 갖고 있었습니까? 지금은 어떻게 바뀌었습니까?
  • 내일부터 일상에서 AI를 볼 때, 새롭게 눈여겨보게 될 것은 무엇입니까?

퍼셉트론 한 개에서 출발해, 오늘 ImageNet의 어깨 위에 올라탔습니다. 여러분은 이제 모델을 이해하는 사람에서 모델을 설계하고 설명하는 사람으로 한 걸음 옮겼습니다.

AI의 미래는 거창한 연구실이 아니라, 오늘 여러분이 쓴 에세이 같은 작은 질문들로 만들어집니다. “이 AI는 누구를 돕는가? 누구를 해칠 수 있는가?” 이 질문을 잃지 않는 개발자가, 10년 뒤에도 필요한 사람입니다.

긴 10차시, 수고하셨습니다. 코드는 깃허브에, 질문은 마음에 담아 가세요.