코드


<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>

1️⃣ 신경망이 특징을 찾는 과정

💡 신경망이 특징을 찾는 과정은 다음과 같아!

  1. 처음에는 가중치(W)가 랜덤한 값이야.
  2. 데이터를 입력하면 출력이 랜덤하게 나옴.
  3. 정답과 비교해서 오차(예측값 - 실제값)를 계산함.
  4. 오차를 줄이도록 가중치(W)를 조정함.
  5. 이 과정을 반복하면, 가중치가 점점 더 좋은 특징을 학습함.

즉, 가중치(W)가 데이터에서 어떤 특징이 중요한지 학습하는 역할을 하는 거야!


2️⃣ 예제: 이미지에서 특징을 찾는 과정

MNIST 숫자 인식에서 신경망이 학습하는 특징을 예제로 살펴보자!

🔹 첫 번째 은닉층 (50개 뉴런)

📌 기본적인 패턴을 찾음!

🔍 시각적으로 보면

makefile
복사편집
뉴런1: ─── (왼쪽 모서리 선 감지)
뉴런2: ─── (오른쪽 곡선 감지)
뉴런3: ─── (위쪽 점 감지)
...
총 50개의 뉴런이 각각 다른 특징을 학습함.


🔹 두 번째 은닉층 (100개 뉴런)

📌 더 복잡한 패턴을 찾음!

🔍 시각적으로 보면

makefile
복사편집
뉴런1: ─── (숫자 3의 곡선 감지)
뉴런2: ─── (숫자 8의 내부 원 감지)
뉴런3: ─── (숫자 7의 가로선 감지)
...
총 100개의 뉴런이 숫자의 특정 패턴을 학습함.


🔹 출력층 (10개 뉴런)

📌 최종적으로 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>

3️⃣ 선형 vs. 비선형 비교


<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>