컴퓨터의 역사부터 딥러닝·생성형 AI, 그리고 파이썬 실습까지 — 인공지능의 큰 그림을 한 번에.
지금의 인공지능은 하루아침에 나온 게 아니다. 200년에 걸친 계산·통신·데이터의 발전 위에 서 있다.

Ada로 명명해 업적을 기림.
판정단이 상대가 기계인지 사람인지 구분하지 못하면 '지능 있음'으로 판정. 2014년 '유진 구스트만' 프로그램이 판정단의 33%를 속였다는 주장(논란 있음).
ACM이 1966년 제정한 컴퓨터과학 최고 권위상 — '컴퓨터과학의 노벨상'. 앨런 튜링의 이름에서 유래. 존 매카시는 1956년 다트머스 학회에서 처음으로 '인공지능(Artificial Intelligence)'이라는 용어를 사용.
| 시대 | 주요 사건 | 의미 |
|---|---|---|
| 1960s | UNIX 개발(켄 톰슨, 1969), OS·DB·SW 개념 정립 | IT의 시작 |
| 1970s | TCP/IP 개발(서프 & 칸, 1973), OSI 7 Layer(1984) | 네트워크 표준화 |
| 1980s | Sun Microsystems(1982), 한국 인터넷 연결(전길남, 1982), WWW 제안(팀 버너스리, 1989) | 글로벌 네트워크 확장 |
| 1990s | WWW 등장(1990), Linux(1991), Google 설립(1998) | 정보 공유 혁명 |
| 2000s | Facebook(2004), AWS(2006), iPhone(2007) | 소셜·모바일 시대 |
| 2010s | AlexNet ImageNet 우승(2012), AlphaGo vs 이세돌(2016) | AI 부흥 |
| 2020s | ChatGPT(2022), GPT-4(2023), Gemini·Claude, AI 노벨상(2024) | 생성형 AI 시대 |
| 구분 | 시기 | 주요 기술 | 영향 |
|---|---|---|---|
| 1차 | 1784~ | 수력·증기기관 | 수공업 → 기계화 생산 |
| 2차 | 1870~ | 전기에너지 | 대량 생산·소비 시대 |
| 3차 | 1969~ | 전자·정보기술(IT) | 생산 자동화·통신혁명 |
| 4차 | 2014~ | IoT·AI·로봇·USN | 초연결·초지능, 기계가 인간 판단력 대체 |

| 순위 | 2007 | 2017 | 2023 | 2025(추정) |
|---|---|---|---|---|
| 1 | 페트로차이나 | 애플 | 애플 | 엔비디아 |
| 2 | 엑슨모빌 | 구글 | MS | 애플 |
| 3 | GE | MS | 사우디아람코 | MS |
| 4 | 차이나모바일 | 아마존 | 알파벳 | 알파벳 |
| 5 | 공상은행 | 메타 | 아마존 | 아마존 |
| 세대 | 시기 | 특징 |
|---|---|---|
| 1G | 1984 | 아날로그 음성, 단말 약 400만원 |
| 2G | 1996 | 디지털 음성·문자(CDMA), 대중화 |
| 3G | 2002 | 영상통화·멀티미디어, 스마트폰 등장(2007) |
| 4G | 2011 | LTE, 최대 1Gbps, 지연 10ms |
| 5G | 2019 | 20Gbps, 100만 기기/km², 지연 1ms |
| 항목 | 인간의 두뇌 | 인공 신경망(ANN) |
|---|---|---|
| 구조 | 뉴런 약 1,000억 개, 시냅스 약 100조 개 | 입력층 – 은닉층(다중) – 출력층 |
| 전력 | 약 20W (매우 효율적) | 수백~수만 W (비효율) |
| 학습 | 적은 데이터로 빠르게 일반화 | 대량 데이터·알고리즘 필요 |
| 범용성 | 매우 높음(유연·창의적) | 특정 작업 특화(ANI) |
| 일관성 | 감정·피로에 영향 | 같은 입력 → 항상 같은 출력 |


① 탄생(1952~56) — 1956년 다트머스 컨퍼런스에서 AI 개념 정립(존 매카시·마빈 민스키·앨런 뉴엘·허버트 사이먼).
② 1차 붐(1956~74) — 추리·탐색 — 탐색 트리로 미로·하노이탑 등 문제 해결.

미국 심리학자 프랭크 로젠블랫이 1957년 제안. 생물학적 뉴런을 흉내 낸 수학 모델로 딥러닝의 기본 단위. 여러 입력을 가중치로 합쳐 하나의 출력을 낸다.
이후 ELIZA(1966, 최초의 자연어 대화 프로그램), Shakey the Robot(1966~72, 최초의 이동 로봇)이 등장.
1969년 마빈 민스키·시모어 페퍼트가 단층 퍼셉트론은 XOR 문제를 풀 수 없다고 지적 → 투자 급감. 해법은 다층 퍼셉트론이었다.

④ 2차 붐(1980~87) — 지식: 전문가 시스템 등장(의학·법률). 단, 상식 추론 한계로 실패.
⑤ 2차 암흑기(1987~93): 1989년 CNN 등장(얀 르쿤), 1993년 우편번호 인식(LeNet-5) 실용화.

⑥ 3차 붐(1994~현재) — 딥러닝: 아래 표 참고.


| 연도 | 사건 |
|---|---|
| 2012 | ImageNet에서 AlexNet 압승(제프리 힌튼 팀, 에러율 16.4%) |
| 2014 | 구글 딥마인드 인수 / GAN 발표(이안 굿펠로) |
| 2016 | AlphaGo vs 이세돌(4승 1패) |
| 2020 | OpenAI GPT-3 발표 |
| 2022.11 | ChatGPT 출시(5일 만에 100만 사용자) |
| 2023 | GPT-4 · Claude · Gemini 경쟁 본격화 / 제프리 힌튼 구글 퇴사 후 AI 위험 경고 |
| 2024.10 | 노벨 물리학상(존 홉필드·제프리 힌튼) · 노벨 화학상(데미스 허사비스·존 점퍼, AlphaFold2) |
| 항목 | 기호주의(Symbolism) | 연결주의(Connectionism) |
|---|---|---|
| 전제 | 지능 = 논리적 추론 | 지능 = 패턴 인식·학습 |
| 방법 | 규칙·지식 그래프 | 가중치 학습·역전파·경사하강법 |
| 대표 | 전문가 시스템, Prolog, LISP | 퍼셉트론, CNN, Transformer |
| 인물 | 앨런 뉴엘, 허버트 사이먼, 존 매카시 | 프랭크 로젠블랫, 제프리 힌튼, 얀 르쿤 |
| 강점 | 설명 가능성, 명시적 추론 | 패턴 인식, 일반화, 비정형 데이터 |

AI는 편리함만큼이나 새로운 사회 문제도 함께 가져온다. 기술을 올바르게 쓰기 위한 고민이 곧 AI 윤리다. 크게 공정성·진실성·권리·안전·제도의 축으로 살펴본다.
| 사람처럼 (Humanly) | 합리적으로 (Rationally) | |
|---|---|---|
| 생각 (Thinking) | 사람처럼 생각하는 시스템 (인지 모델링) | 합리적으로 생각하는 시스템 (논리·추론) |
| 행동 (Acting) | 사람처럼 행동하는 시스템 (튜링 테스트) | 합리적으로 행동하는 시스템 (지능 에이전트·강화학습) |
기계가 수많은 데이터로 스스로 규칙을 발견하고, 새 데이터에 적용해 예측·분류하는 기술.
머신러닝의 한 분야로, 다층 인공신경망을 사용해 복잡한 패턴을 자동으로 학습.
| 아키텍처 | 특징 | 주요 응용 |
|---|---|---|
| CNN 합성곱 신경망 | 이미지의 공간적 특징 추출(얀 르쿤, 1989) | 이미지 분류·객체 검출·안면인식·OCR |
| RNN 순환 신경망 | 시퀀스·시간 의존성 처리 | 자연어·음성·시계열 |
| LSTM | RNN의 장기 의존성 문제 해결 | 기계번역·텍스트 생성 |
| GAN 적대적 생성망 | 생성자·판별자 경쟁 학습(굿펠로, 2014) | 이미지 생성·딥페이크·스타일 전이 |
| Transformer | 어텐션(Attention) 메커니즘 | GPT·BERT·ChatGPT·Claude의 기반 |
| 모델 | 개발사 | 특징 |
|---|---|---|
| ChatGPT / GPT-4o | OpenAI(2015.12 설립) | 텍스트·코드·이미지·음성 멀티모달 |
| Claude | Anthropic(2021) | 안전성 중심 설계, Constitutional AI |
| Gemini | Google DeepMind | 검색·Workspace 통합, 멀티모달 |
| DALL·E 3 | OpenAI | 텍스트 → 고품질 이미지 |
| MidJourney v6 | MidJourney | 예술적 이미지 생성 |
| Stable Diffusion | Stability AI | 오픈소스·무료 |
| Sora | OpenAI(2024) | 텍스트 → 최대 1분 동영상 |
토큰은 거대언어모델(LLM)이 글을 읽고 쓸 때 다루는 최소 단위이다. 사람은 문장을 단어로 이해하지만, AI는 문장을 잘게 쪼갠 조각(토큰)으로 나눈 뒤, 각 토큰을 번호(정수)로 바꿔 계산한다.
unbelievable → un + believ + able| 개념 | 뜻 | 왜 중요한가 |
|---|---|---|
| 토큰(Token) | 글을 쪼갠 최소 처리 단위 | AI는 글자가 아니라 토큰으로 생각한다 |
| 컨텍스트 창 (Context Window) | 한 번에 볼 수 있는 토큰 한도 | 넘으면 앞 내용을 '잊는다'(길이 제한) |
| 토큰 = 비용 | API 요금이 토큰 수로 매겨짐 | 입력+출력 토큰이 많을수록 비쌈 |
st·raw·berry)로 보기 때문에, 의외로 글자 수 세기에는 약하다. 토큰의 원리를 알면 AI의 강점과 한계를 함께 이해할 수 있다.OpenAI의 실제 토크나이저 tiktoken으로 문장이 몇 토큰인지 확인해보라. 구글 코랩(Colab)에서 !pip install tiktoken 후 그대로 실행된다.
# pip install tiktoken import tiktoken # GPT-4o가 사용하는 실제 토크나이저 enc = tiktoken.get_encoding("o200k_base") samples = [ "Artificial intelligence is unbelievable", "인공지능은 정말 재미있다", "strawberry", ] for text in samples: ids = enc.encode(text) # 문장 → 토큰 번호 목록 pieces = [enc.decode([i]) for i in ids] # 각 번호 → 토큰 조각 print(f"문장 : {text}") print(f"토큰 수 : {len(ids)}개") print(f"토큰 번호: {ids}") print(f"토큰 조각: {pieces}") print("-" * 50)
문장 : Artificial intelligence is unbelievable 토큰 수 : 4개 토큰 번호: [186671, 22990, 382, 83614] 토큰 조각: ['Artificial', ' intelligence', ' is', ' unbelievable'] -------------------------------------------------- 문장 : 인공지능은 정말 재미있다 토큰 수 : 8개 토큰 번호: [5544, 185890, 19906, 4740, 110308, 193303, 14138, 2276] 토큰 조각: ['인', '공지', '능', '은', ' 정말', ' 재미', '있', '다'] -------------------------------------------------- 문장 : strawberry 토큰 수 : 3개 토큰 번호: [302, 1618, 19772] 토큰 조각: ['st', 'raw', 'berry'] --------------------------------------------------
구글 코랩(Colab)에서 바로 돌려볼 수 있는 예제들이다. 코드는 위에서부터 따라 읽어보라.
선형회귀: 알려진 데이터로 알 수 없는 값을 예측. 독립변수 x, 종속변수 y를 직선 y = Wx + b로 모델링한다.
# 한글 폰트 지원 라이브러리 설치 (Colab에서 최초 1회 실행) !pip install koreanize-matplotlib # 1. 라이브러리 불러오기 import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression import koreanize_matplotlib # 2. 선형 회귀 모델 생성 regr = LinearRegression() # 3. 학습 데이터 준비 (키 → 몸무게) x = [[164], [179], [162], [170], [173]] # 입력 데이터(키) y = [53, 63, 55, 59, 68] # 출력 데이터(몸무게) # 4. 모델 학습 regr.fit(x, y) # 5. 모델 정확도 확인 print("정확도:", regr.score(x, y)) # 6. 새로운 키 데이터 준비 a = [[180], [162], [173]] # 7. 몸무게 예측 result = regr.predict(a) print("예측 결과:") for height, weight in zip(a, result): print(f"키 {height[0]}cm → 예상 몸무게 {weight:.1f}kg") # 8. 결과 시각화 plt.figure(figsize=(8, 6)) plt.scatter(x, y, color='blue', label='실제 데이터') # 원본 데이터 plt.plot(x, regr.predict(x), color='red', label='회귀선') # 회귀선 plt.scatter(a, result, color='green', marker='x', s=100, label='예측 데이터') plt.xlabel('키 (cm)') plt.ylabel('몸무게 (kg)') plt.title('키에 따른 몸무게 예측 (선형 회귀)') plt.legend() plt.grid(True) plt.show()
정확도: 0.627529242117842 예측 결과: [66.86680761 54.28964059 61.9756871 ]

같은 예측을 신경망으로. H(x) = W·x + b의 가중치 W와 편향 b를 학습으로 찾는다.
# 한글 폰트 지원 라이브러리 설치 (Colab에서 최초 1회 실행) !pip install koreanize-matplotlib # 1. 라이브러리 불러오기 import koreanize_matplotlib from keras.models import Sequential from keras.layers import Dense import numpy as np # 데이터 준비 x = np.array([1, 2, 3, 4, 5]) y = np.array([1, 2, 3, 4, 5]) # 모델 구성 (입력층 → 은닉층 → 출력층) model = Sequential() model.add(Dense(5, input_dim=1, activation='relu')) # 입력층 + 은닉층 model.add(Dense(3)) # 은닉층 model.add(Dense(1)) # 출력층 # 모델 컴파일 model.compile( loss='mse', optimizer='adam', metrics=['mae'] # 회귀는 정확도(acc)가 아니라 mae(평균절대오차)로 평가 ) # 모델 학습 model.fit(x, y, epochs=100, batch_size=1)
model.compile()의 세 가지 설정 — 모델을 어떻게 학습·평가할지 정하는 부분이다.
loss='mse' · 손실 함수(평균제곱오차, Mean Squared Error) — 예측값과 실제값의 차이를 제곱해 평균낸 값. 학습은 이 손실을 최소화하는 방향으로 가중치를 조정한다. 제곱하므로 큰 오차에 더 민감해 회귀(숫자 예측)에서 표준으로 쓰인다.optimizer='adam' · 최적화 알고리즘 — 손실을 줄이려고 가중치를 어떻게 갱신할지 정하는 방법. 경사하강법을 개선해 학습률을 자동 조절하므로 빠르고 안정적이라, 딥러닝에서 가장 무난한 기본 선택이다.metrics=['mae'] · 평가 지표(평균절대오차, Mean Absolute Error) — 학습에 직접 쓰이진 않고 사람이 성능을 보기 위한 참고 값. 오차의 절댓값 평균이라 "평균적으로 얼마나 빗나갔나"를 원래 단위 그대로 직관적으로 보여준다. 회귀라서 정확도(accuracy) 대신 MAE를 쓴다.


MNIST: 0~9 손글씨 숫자 이미지 70,000개(학습 60,000 + 평가 10,000), 크기 28×28 픽셀. Dense 층만 쓰는 기본 인공신경망(ANN)으로 분류한다.
""" MNIST 손글씨 숫자 인식 - ANN(인공신경망) 기반 Keras Sequential 모델 사용 (CNN이 아닌 Dense layer만 사용한 기본 ANN) """ # 한글 폰트 지원 라이브러리 설치 (Colab에서 최초 1회 실행) !pip install koreanize-matplotlib # 1. 라이브러리 불러오기 import koreanize_matplotlib import numpy as np import matplotlib.pyplot as plt from tensorflow import keras from tensorflow.keras import layers # 1. 데이터 불러오기 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() print("훈련 데이터 shape:", x_train.shape) # (60000, 28, 28) print("테스트 데이터 shape:", x_test.shape) # (10000, 28, 28) # 2. 데이터 전처리 # ANN은 1차원 입력을 받으므로 28x28 이미지를 784차원 벡터로 펼침(flatten) x_train = x_train.reshape(-1, 28 * 28).astype("float32") x_test = x_test.reshape(-1, 28 * 28).astype("float32") # 픽셀값(0~255)을 0~1 사이로 정규화 x_train /= 255.0 x_test /= 255.0 # 레이블(0~9)을 원-핫 인코딩으로 변환 num_classes = 10 y_train_cat = keras.utils.to_categorical(y_train, num_classes) y_test_cat = keras.utils.to_categorical(y_test, num_classes) # 3. ANN 모델 구성 (Sequential) model = keras.Sequential([ layers.Input(shape=(784,)), layers.Dense(256, activation="relu"), layers.Dropout(0.2), layers.Dense(128, activation="relu"), layers.Dropout(0.2), layers.Dense(num_classes, activation="softmax") ]) model.summary() # 4. 모델 컴파일 model.compile( optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"] ) # 5. 모델 학습 history = model.fit( x_train, y_train_cat, epochs=15, batch_size=128, validation_split=0.1, verbose=1 ) # 6. 모델 평가 test_loss, test_acc = model.evaluate(x_test, y_test_cat, verbose=0) print(f"\n테스트 정확도: {test_acc:.4f}") print(f"테스트 손실: {test_loss:.4f}") # 7. 학습 곡선 시각화 plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history["accuracy"], label="train_acc") plt.plot(history.history["val_accuracy"], label="val_acc") plt.title("Accuracy"); plt.xlabel("Epoch"); plt.ylabel("Accuracy"); plt.legend() plt.subplot(1, 2, 2) plt.plot(history.history["loss"], label="train_loss") plt.plot(history.history["val_loss"], label="val_loss") plt.title("Loss"); plt.xlabel("Epoch"); plt.ylabel("Loss"); plt.legend() plt.tight_layout(); plt.show() # 8. 예측 결과 확인 (테스트 샘플 10개) predictions = model.predict(x_test[:10]) predicted_labels = np.argmax(predictions, axis=1) plt.figure(figsize=(12, 4)) for i in range(10): plt.subplot(2, 5, i + 1) plt.imshow(x_test[i].reshape(28, 28), cmap="gray") correct = predicted_labels[i] == y_test[i] color = "green" if correct else "red" plt.title(f"예측:{predicted_labels[i]} / 실제:{y_test[i]}", color=color, fontsize=9) plt.axis("off") plt.tight_layout(); plt.show() # 9. 모델 저장 (선택) model.save("mnist_ann_model.keras") print("모델이 'mnist_ann_model.keras' 로 저장되었습니다.")


Fashion MNIST: 옷·신발 등 10종 이미지 분류. CNN(합성곱 신경망)으로 구현 — Conv2D/MaxPooling이 왜 필요한지 ANN과 비교해 보라.
""" Fashion MNIST 이미지 분류 - CNN(합성곱 신경망) 기반 Keras Sequential 모델 사용 (Conv2D + MaxPooling2D + Dense) 패션 이미지 10종 분류 (T-shirt, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle boot) """ # 한글 폰트 지원 라이브러리 설치 (Colab에서 최초 1회 실행) !pip install koreanize-matplotlib # 1. 라이브러리 불러오기 import koreanize_matplotlib import numpy as np import matplotlib.pyplot as plt from tensorflow import keras from tensorflow.keras import layers # 1. 데이터 불러오기 (x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data() class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"] # 2. 데이터 전처리 # CNN은 (배치, 높이, 너비, 채널) 형태의 4차원 입력을 받음 (흑백이라 채널 1) x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0 num_classes = 10 y_train_cat = keras.utils.to_categorical(y_train, num_classes) y_test_cat = keras.utils.to_categorical(y_test, num_classes) # 3. CNN 모델 구성 (Sequential) model = keras.Sequential([ layers.Input(shape=(28, 28, 1)), # 첫 번째 합성곱 블록: 지역적인 특징(모서리, 선) 추출 layers.Conv2D(32, kernel_size=(3, 3), activation="relu", padding="same"), layers.MaxPooling2D(pool_size=(2, 2)), # 28x28 -> 14x14 # 두 번째 합성곱 블록: 더 추상적인 특징(모양, 패턴) 추출 layers.Conv2D(64, kernel_size=(3, 3), activation="relu", padding="same"), layers.MaxPooling2D(pool_size=(2, 2)), # 14x14 -> 7x7 # 세 번째 합성곱 블록 layers.Conv2D(128, kernel_size=(3, 3), activation="relu", padding="same"), layers.Flatten(), # 2차원 특징맵 → 1차원 layers.Dense(128, activation="relu"), layers.Dropout(0.3), layers.Dense(num_classes, activation="softmax") ]) model.summary() # 4. 모델 컴파일 model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) # 5. 모델 학습 history = model.fit(x_train, y_train_cat, epochs=15, batch_size=128, validation_split=0.1, verbose=1) # 6. 모델 평가 test_loss, test_acc = model.evaluate(x_test, y_test_cat, verbose=0) print(f"\n테스트 정확도: {test_acc:.4f}") # 7. 예측 결과 확인 (테스트 샘플 10개) predictions = model.predict(x_test[:10]) predicted_labels = np.argmax(predictions, axis=1) plt.figure(figsize=(14, 5)) for i in range(10): plt.subplot(2, 5, i + 1) plt.imshow(x_test[i].reshape(28, 28), cmap="gray") correct = predicted_labels[i] == y_test[i] color = "green" if correct else "red" plt.title(f"예측:{class_names[predicted_labels[i]]}\n실제:{class_names[y_test[i]]}", color=color, fontsize=8) plt.axis("off") plt.tight_layout(); plt.show() # 8. 모델 저장 (선택) model.save("fashion_mnist_cnn_model.keras")

지금까지는 AI를 밑바닥부터 직접 학습시켰다. 이번엔 반대로 이미 학습된 AI를 가져다 바로 써보며, AI가 얼마나 가까이 와 있는지 체험해 본다. 아래 넷 모두 구글 코랩(Colab)에서 그대로 실행된다.
3번 실습에서 만든 mnist_ann_model을 불러와, 마우스로 직접 그린 숫자를 예측한다. 내가 만든 AI를 손으로 시험해 보는 실습이다.
# 3번 실습에서 저장한 MNIST 모델을 불러온다 # (새 세션이라 파일이 없으면 여기서 바로 간단히 학습한다 · 약 30초) import os from tensorflow.keras.models import load_model from google.colab import output from IPython.display import HTML, display from base64 import b64decode from PIL import Image import numpy as np, io if not os.path.exists("mnist_ann_model.keras"): from tensorflow import keras from tensorflow.keras import layers (X, y), _ = keras.datasets.mnist.load_data() X = X.reshape(-1, 784).astype("float32") / 255.0 m = keras.Sequential([ layers.Input(shape=(784,)), layers.Dense(256, activation="relu"), layers.Dense(128, activation="relu"), layers.Dense(10, activation="softmax"), ]) m.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) m.fit(X, y, epochs=3, verbose=0) m.save("mnist_ann_model.keras") model = load_model("mnist_ann_model.keras") # [예측] 버튼을 누르면 호출되는 함수 (그림을 받아 숫자를 맞힌다) def predict_digit(data_url): # 1) 캔버스 그림을 흑백 배열로 (흰 글씨 · 검은 배경) img = Image.open(io.BytesIO(b64decode(data_url.split(',')[1]))).convert("L") arr = np.array(img) # 2) 그린 부분(글씨)의 경계 상자만 잘라낸다 ys, xs = np.where(arr > 30) if len(xs) == 0: print("먼저 숫자를 그려주세요.") return arr = arr[ys.min():ys.max() + 1, xs.min():xs.max() + 1] # 3) MNIST처럼 긴 변을 20px로 맞춰 28x28 한가운데에 넣는다 h, w = arr.shape s = 20.0 / max(h, w) digit = Image.fromarray(arr).resize((max(1, int(w * s)), max(1, int(h * s)))) canvas28 = Image.new("L", (28, 28), 0) canvas28.paste(digit, ((28 - digit.width) // 2, (28 - digit.height) // 2)) # 4) 모델 입력 형태로 변환해 예측 x = np.array(canvas28).reshape(1, 784) / 255.0 pred = model.predict(x, verbose=0) print(f"AI 예측: {pred.argmax()} (확신도 {pred.max():.0%})") # 위 함수를 자바스크립트에서 부를 수 있도록 등록 output.register_callback("digit.predict", predict_digit) # 마우스로 숫자를 그리는 캔버스 ([예측] 맞히기 · [지우기] 다시 그리기) canvas = """ <canvas id="cv" width=200 height=200 style="border:2px solid #333"></canvas><br> <button onclick="predict()">예측</button> <button onclick="clr()">지우기</button> <script> var c=document.getElementById('cv'), x=c.getContext('2d'), draw=false; function clr(){x.fillStyle='black'; x.fillRect(0,0,200,200);} clr(); x.strokeStyle='white'; x.lineWidth=14; x.lineCap='round'; c.onmousedown=e=>{draw=true; x.beginPath(); x.moveTo(e.offsetX,e.offsetY);}; c.onmousemove=e=>{if(draw){x.lineTo(e.offsetX,e.offsetY); x.stroke();}}; c.onmouseup=()=>draw=false; function predict(){ google.colab.kernel.invokeFunction('digit.predict', [c.toDataURL()], {}); } </script> """ # 셀은 여기서 바로 끝난다. 이후 [예측]을 누를 때마다 결과가 아래에 찍힌다 (지우고 반복 가능) display(HTML(canvas))
AI 예측: 7 (확신도 98%) AI 예측: 3 (확신도 95%) AI 예측: 0 (확신도 99%)
mnist_ann_model.keras를 쓴다. 새 코랩 세션이라 파일이 없어도 위 코드가 자동으로 잠깐 학습해 주니 단독 실행도 된다(File not found 오류 걱정 없음). 캔버스는 검은 배경에 흰 붓이라 MNIST 데이터(검은 바탕·흰 글씨)와 형태가 같다 — 숫자를 가운데 큼직하게 그릴수록 잘 맞힌다. 이 셀은 캔버스를 띄우면 바로 실행이 끝나고(계속 "실행 중" 아님), 이후 [예측]을 누를 때마다 결과가 아래에 찍힌다. [지우기]로 새 숫자를 그려 몇 번이고 반복할 수 있다.MobileNetV2는 이미 1000종의 사물을 학습해 둔 모델이라 추가 학습 없이 바로 쓸 수 있다. 강아지·음식·물건 사진을 올리면 무엇인지 확률과 함께 알려 준다. 이것이 남이 학습한 모델을 재활용하는 전이학습(Transfer Learning)의 출발점이다.
# MobileNetV2 : 이미 1000종의 사물을 학습해 둔 모델 (학습 0초!) from tensorflow.keras.applications.mobilenet_v2 import ( MobileNetV2, preprocess_input, decode_predictions) from tensorflow.keras.preprocessing import image from google.colab import files import numpy as np model = MobileNetV2(weights="imagenet") up = files.upload() # 내 사진 업로드 (강아지, 음식, 물건...) fname = list(up.keys())[0] # 사진을 224x224 로 맞춰 모델에 넣는다 img = image.load_img(fname, target_size=(224, 224)) x = preprocess_input(np.expand_dims(image.img_to_array(img), 0)) pred = model.predict(x) # 가장 그럴듯한 후보 3개 출력 for _, label, prob in decode_predictions(pred, top=3)[0]: print(f"{label:22s} {prob:.1%}")
golden_retriever 92.4% Labrador_retriever 4.1% tennis_ball 1.3%
이미지가 아니라 글(자연어)을 다뤄 본다. 사전학습 언어모델에 한국어 문장을 넣으면 긍정/부정을 판별한다. 5장에서 배운 토큰·임베딩이 실제로 쓰이는 장면이다.
!pip -q install transformers from transformers import pipeline # 한국어 문장의 긍정/부정을 판별하는 사전학습 모델 sentiment = pipeline("sentiment-analysis", model="matthewburke/korean_sentiment") 문장들 = ["이 영화 진짜 재미있었어요!", "시간이 아까운 영화네요", "배우 연기는 좋았지만 스토리가 조금 아쉽다"] for 문장 in 문장들: r = sentiment(문장)[0] 감정 = "긍정 😊" if r["label"].endswith("1") else "부정 😞" print(f"{문장} -> {감정} ({r['score']:.0%})")
이 영화 진짜 재미있었어요! -> 긍정 😊 (98%) 시간이 아까운 영화네요 -> 부정 😞 (95%) 배우 연기는 좋았지만 스토리가 조금 아쉽다 -> 부정 😞 (74%)
LABEL_1=긍정)이 다를 수 있다. 여러 문장을 직접 바꿔 넣어 결과를 비교해 보자.마지막은 생성형 AI 체험. 내 사진(내용)과 명화 한 장(화풍)을 넣으면, AI가 사진을 그 화가의 그림처럼 바꿔 준다. 스타일 변환(Neural Style Transfer)이라 부른다.
import tensorflow_hub as hub import tensorflow as tf # TensorFlow Hub 의 사전학습된 '스타일 변환' 모델 model = hub.load("https://tfhub.dev/google/magenta/" "arbitrary-image-stylization-v1-256/2") def load(path): img = tf.io.decode_image(tf.io.read_file(path), channels=3) img = tf.image.convert_image_dtype(img, tf.float32) return img[tf.newaxis, :] content = load("my_photo.jpg") # 내 사진 style = load("gogh.jpg") # 고흐 '별이 빛나는 밤' result = model(content, style)[0] # 사진에 화풍을 입힌다 tf.keras.utils.array_to_img(result[0]).save("art.png") print("완성! 'art.png' 저장 — 내 사진이 명화 화풍으로 바뀌었다 🎨")
완성! 'art.png' 저장 — 내 사진이 명화 화풍으로 바뀌었다 🎨
수학 원리를 직접 만져보고 싶다면 → 🧮 AI 수학 강의 로 이어서 학습하라.