728x90
반응형
저번에 신경망의 구조를 배웠으니 이젠 실전에서 적용해볼 차례이다.
이번에 해볼 것은 손글씨 숫자 분류이다.
기계학습과 마찬가지로 신경망도 두 단계를 거쳐 문제를 해결한다.
먼저 훈련 데이터(학습 데이터)를 사용해 가중치 매개변수를 학습하고,
추론 단계에서는 앞서 학습한 매개변수를 사용하여 입력 데이터를 분류한다.
이런 추론 과정을 신경망의 순전파(forward propagation)이라고 하고, 이것을 오늘 구현할 것이다.
MNIST 데이터셋
이번에 사용하는 데이터셋은 MNIST라는 손글씨 숫자 이미지 집합이다.
MNIST는 기계학습 분야에서 아주 유명한 데이터셋이다.
MNSIT 데이터셋은 28x28크기의 회색조 이미지이며 각 픽셀은 0부터 255까지의 값을 취한다.
또한 이미지들은 0부터 9까지 숫자 이미지로 구성된다.
훈련 이미지가 60,000장, 시험 이미지가 10,000장이 준비되어 있다.
훈련 이미지를 사용해 모델을 학습하고, 학습된 모델로 시험 이미지들을 얼마나 정확하게 분류하는지를 평가한다.
책에서는 MNIST 데이터셋을 내려받아 이미지를 넘파이 배열로 변환해주는 파이썬 스크립 트를 제공해줬다.(깃허브 저장소의 dataset/mnist.py파일)
mnist.py 파일에 정의된 load_mnist() 함수를 이용해서 MNIST 데이터를 아주 쉽게 가져올 수 있었다.
import sys
import os
import pickle
import numpy as np
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax
# flatten : 입력 이미지를 평탄화(1차원 배열로)
# normalize : 입력 이미지를 정규화(0.0~1.0 사이의 값으로)
# one_hot_label : 레이블을 원-핫 인코딩 형태로 저장
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,
normalize=False)
# 각 데이터의 형상 출력
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,)
# 신경망의 추론 처리
'''
입력층 784개, 출력층 10개,
은닉층 50개, 100개로 구성(임의)
'''
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))) # Accuracy:0.9352
'''
# 배치 처리
batch_size = 100
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))) # Accuracy:0.9352
여기까지가 책에 기재된 코드이다.
다음장은 손실함수에 대하여 자세히 배운다.
728x90
반응형
'밑바닥부터시작하는딥러닝' 카테고리의 다른 글
다차원의 배열 계산 (1) | 2023.05.26 |
---|---|
신경망 (0) | 2023.05.24 |
퍼셉트론 (0) | 2023.05.16 |