[딥러닝]/[밑바닥부터 시작하는 딥러닝]

밑바닥부터 시작하는 딥러닝 1 - 3 손글씨 숫자 인식 예제

딥러닝 도전기 2021. 6. 26. 01:58
신경망에서는 우선 훈련 데이터를 사용해 가중치 매개변수를 학습하고, 
추론 단계에서 이 매개변수를 사용해 입력 데이터를 분류합니다.

위 사진과 같이 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 범위로 변환합니다.

또한 신경망의 입력 데이터에 특정 변환을 가하는 것을 전처리라고 합니다.

 

반응형