import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
# (훈련이미지, 훈련레이블), (시험이미지, 시험레이블) 형식으로 반환
(x_train, t_train), (x_test, t_test) = \
load_mnist(
flatten=True, normalize=True, one_hot_label=Flase) # flatten = True, 읽어들인 이미지는 1차원 넘파이 배열로 저장됨
def load_mnist(normalize=True, flatten=True, one_hot_label=False):
if not os.path.exists(save_file):
init_mnist()
with open(save_file, 'rb') as f:
dataset = pickle.load(f)
if normalize:
for key in ('train_img', 'test_img'):
dataset[key] = dataset[key].astype(np.float32)
dataset[key] /= 255.0
if one_hot_label:
dataset['train_label'] = _change_one_hot_label(dataset['train_label'])
dataset['test_label'] = _change_one_hot_label(dataset['test_label'])
if not flatten:
for key in ('train_img', 'test_img'):
dataset[key] = dataset[key].reshape(-1, 1, 28, 28)
return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label'])
Parameters
----------
normalize : 이미지의 픽셀 값을 0.0~1.0 사이의 값으로 정규화할지 정한다.
one_hot_label :
one_hot_label이 True면、레이블을 원-핫(one-hot) 배열로 돌려준다.
one-hot 배열은 예를 들어 [0,0,1,0,0,0,0,0,0,0]처럼 한 원소만 1인 배열이다.
flatten : 입력 이미지를 1차원 배열로 만들지를 정한다.
Returns
-------
(훈련 이미지, 훈련 레이블), (시험 이미지, 시험 레이블)
import pickle
import numpy as np
import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax
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 # 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):
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 # 각 레이블의 확률을 넘파이 배열로 반환
x, t = get_data() # x에는 입력데이터, t에는 입력데이터에 대한 레이블이 저장된다.
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("Accuracy:" + str(float(accuracy_cnt / len(x))))
x, t = get_data()
network = init_network()
batch_size = 100 # 배치크기 설정
accuracy_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)))
Leave a comment