코드
<aside>
import sys
import os
import numpy as np
import pickle
# 은닉층은 총 2개(50, 100으로 임의로 정한 값)
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
return x_test, t_test # 테스트 데이터만 가져옴
# 신경망의 가중치와 편향 값을 로드
# 가중치는 "sample_weight.pkl" 파일에서 가져옴
def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f) # pickle : 파이썬 객체를 파일로 저장하거나 불러옴
return network
def predict(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
z3 = sigmoid(a3)
y = softmax(a3)
return y
x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
y = predict(network, x[i])
p = np.argmax(y) # 확률이 가장 높은 클래스 선택
if p == t[i]: # 정답과 비교
accuracy_cnt += 1
print("Accurancy:" + str(float(accuracy_cnt) / len(x))) # 모델의 정확도 출력
</aside>
동작 설명(GPT)
<aside>
💡 신경망이 특징을 찾는 과정은 다음과 같아!
즉, 가중치(W)가 데이터에서 어떤 특징이 중요한지 학습하는 역할을 하는 거야!
MNIST 숫자 인식에서 신경망이 학습하는 특징을 예제로 살펴보자!
📌 기본적인 패턴을 찾음!
🔍 시각적으로 보면
makefile
복사편집
뉴런1: ─── (왼쪽 모서리 선 감지)
뉴런2: ─── (오른쪽 곡선 감지)
뉴런3: ─── (위쪽 점 감지)
...
총 50개의 뉴런이 각각 다른 특징을 학습함.
📌 더 복잡한 패턴을 찾음!
🔍 시각적으로 보면
makefile
복사편집
뉴런1: ─── (숫자 3의 곡선 감지)
뉴런2: ─── (숫자 8의 내부 원 감지)
뉴런3: ─── (숫자 7의 가로선 감지)
...
총 100개의 뉴런이 숫자의 특정 패턴을 학습함.
📌 최종적으로 0~9 중 하나를 예측함.
🔍 출력 예시
css
복사편집
0️⃣ [0.01]
1️⃣ [0.02]
2️⃣ [0.05]
3️⃣ [0.90] <- 가장 높은 확률! "3"로 예측
4️⃣ [0.02]
5️⃣ [0.03]
6️⃣ [0.01]
7️⃣ [0.01]
8️⃣ [0.04]
9️⃣ [0.02]
</aside>
<aside>
| 선형 함수 (Linear) | 비선형 함수 (Non-Linear) | |
|---|---|---|
| 예제 함수 | y=ax+by = ax + by=ax+b | y=max(0,x)y = \max(0, x)y=max(0,x) (ReLU) |
| 그래프 모양 | 직선 | 곡선 |
| 층을 많이 쌓을 때? | 여전히 선형 (효과 없음) | 복잡한 패턴 학습 가능 |
| 분류 가능 여부 | XOR 같은 문제 해결 불가능 | XOR, 이미지 분류 가능 |
| 활성화 함수 적용 여부 | ❌ 없음 | ✅ 필요 |
| </aside> |