728x90
반응형
MNIST 데이터셋을 가지고 추론을 수행하는 신경망을 구성
신경망은 입력층 뉴런을 784개 - 이미지의 크기가 28 * 28 = 784
출력층 뉴런을 10개 - 0에서 9까지의 손글씨 숫자라서
코드
import pickle
import sys,os
sys.path.append(os.pardir)
from mnist import load_mnist
import numpy as np
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) # 오버플로 대책
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
def sigmoid(x):
return 1/(1+np.exp(-x)) # 시그모이드 수식v
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
def init_network():
with open("sample_weight.pkl",'rb') as f:
network = pickle.load(f)
return network
def predict(network, x): # predict 함수는 각 레이블의 확률을 넘파이 배열로 반환한다.
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
y = softmax(a3)
return y
# 0일 확률이 0.1 1일 확률이 0.3 이런 식으로 해석한다.
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 # 신경망이 예측한 답변과 정답 레이블을 비교해 맞힌 숫자(accuaracy_cnt)를 세고, 이를 전체 이미지 숫자로 나눠 정확도를 구한다.
print("Accuracy:" + str(float(accuracy_cnt)/ len(x)))
** 데이터를 특정 범위로 변화하는 처리 - 정규화
- normalize - True - ~255 범위인 각 픽셀의 값을 0.0~1.0 범위로 변환(단순한 픽셀의 값을 255로 나눈다.)
신경망의 입력 데이터에 특정 변환을 가하는 것을 전처리
x, t = get_data()
network = init_network()
batch_size = 100 # 배치 크기
acuaracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt+= np.sum(p == t[i:i+batch_size])
print("Accuracy : " + str(float(accuracy_cnt) / len(x)))
출처 : 밑바닥부터 시작하는 딥러닝
https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198
728x90
반응형
최근댓글