신경망에서는 우선 훈련 데이터를 사용해 가중치 매개변수를 학습하고,
추론 단계에서 이 매개변수를 사용해 입력 데이터를 분류합니다.
위 사진과 같이 dataset이라는 디렉터리 안에 mnist.py라는 파일이 있습니다.
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)
우선 위의 코드를 이용하여 로드가 잘 되었나 확인해줍니다.
from dataset.mnist import load_mnist
import numpy as np
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False, one_hot_label=False)
img = x_train[0]
label = t_train[0]
print(label)
print(img.shape)
img = img.reshape(28, 28)
print(img.shape)
img_show(img)
위 코드를 실행하면
이처럼 mnist.py 파일 안에 있는 손글씨 5가 보여지게 됩니다.
다음으로 sigmoid 함수를 활성화 함수로, softmax 함수를 출력층의 활성화 함수로 사용하여 추론을 수행하는 신경망을 구현해보겠습니다.
from dataset.mnist import load_mnist
import numpy as np
import pickle
from PIL import Image
def sigmoid(x):
return 1 / (1 + np.exp(-x))
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 get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=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):
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()
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)))
여기서 init_network 함수 내부에 있는 sample_weight.pkl에는 이미 학습된 가중치 매개변수에 대한 정보가 있습니다.
지금은 학습시키는 것이 목적이 아니고 학습된 데이터를 이용하여 추론하는 것이 목적이기 때문에 이미 학습된 데이터를 사용합니다.
for문에서는 accuracy_cnt 값을 이용해 정확도를 계산합니다.
normalize = True 라는 것은 정규화를 시키겠다는 것입니다. 0~255인 픽셀의 값을 0~1 범위로 변환합니다.
또한 신경망의 입력 데이터에 특정 변환을 가하는 것을 전처리라고 합니다.
반응형
'[딥러닝] > [밑바닥부터 시작하는 딥러닝]' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 1 - 4 경사 하강법 (0) | 2021.06.27 |
---|---|
밑바닥부터 시작하는 딥러닝 1 - 4 신경망 학습 (0) | 2021.06.26 |
밑바닥부터 시작하는 딥러닝 1 - 3 신경망 (0) | 2021.06.25 |
밑바닥부터 시작하는 딥러닝 1 - 2 퍼셉트론 (0) | 2021.06.24 |
[밑바닥부터 시작하는 딥러닝] 교재 소개 (0) | 2021.05.28 |