01. MNIST Dataset
- MNIST Dataset은 0 ~ 9까지의 숫자 이미지로 구성됩니다.
- train은 60,000장, test는 10,000장 준비되어 있습니다.
- 이미지 데이터의 크기는 28x28 (회색조 이미지 = 1채널) 입니다.
- 각 픽셀은 0 ~ 255까지의 값을 가집니다.
- label 또한 붙어 있습니다.
이미지들을 사용하여 모델을 학습하고, 학습한 모델로 시험 이미지들을 얼마나 정확하게 분류하는지를 평가합니다.
MNIST 이미지 화면으로 불러오기
- 이미지 표시할 때 : 원래 크기 필수
- PIL: numpy -> PIL용 데이터 객체로 변환해야 함
현재 데이터는 flatten: 1차원 numpy 배열로 저장되어 있습니다.
이미지를 표시할 때는 원래 크기인 28x28 형태를 유지해야 합니다. 따라서 reshape()을 이용하여 크기를 변형합니다.
Image.fromarray(): numpy로 저장된 이미지 데이터를 PIL용 데이터 객체로 변환해줍니다.
02. 신경망의 추론 처리
MNIST 데이터셋을 가지고 추론을 수행하는 신경망을 구현해보겠습니다.
이 신경망은 입력층 뉴런 784개, 출력층 뉴런을 10개로 구성합니다.
은닉층은 총 2개로, 첫 번째는 50개의 뉴런 두 번쨰는 100개의 뉴런을 배치합니다. (임의로 정해준 것)
- 784인 이유: 이미지 크기가 28x28 = 784이기 때문
- 10인 이유: 분류가 0 ~ 9 까지의 숫자를 구분하는 문제이기 때문
import sys, os
sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
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
# 학습된 가중치 매개변수를 읽습니다.
# 가중치와 편향 매개변수가 딕셔너리 변수로 저장되어 있습니다.
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
<neuralnet_mnist.py>
위의 세 함수를 이용하여 신경망에 의한 추론과 정확도를 평가해 보겠습니다.
- yy: predict() 함수의 출력 활성화 함수가 softmax 이므로, y 값은 0 ~ 9 각 label의 확률을 numpy 배열로 반환합니다.
- np.argmax(): y 배열에서 가장 값이 큰 원소의 index를 구합니다. 이것이 바로 예측 결과입니다.
03. 배치 처리
입력 데이터와 가중치 매개변수의 형상에 주의하여 조금 전의 구현을 다시 살펴보겠습니다.
먼저 신경망 각 층의 가중치 형상을 출력합니다.
1장의 이미지를 입력으로 넣어주면, 입력 데이터 x의 형상은 28x28 = 784, 출력 데이터의 형상은 10 입니다.
100개를 묶어서 Predict() 함수에 한 번에 넣어주면, 입력 데이터 x의 형상은 100x784, 출력 데이터의 형상은 100x10이 됩니다.
즉, 100개의 입력 데이터의 결과가 한 번에 출력됩니다. 이처럼 하나로 묶은 입력 데이터를 배치라 합니다.
다음은 배치 처리를 구현해봅니다.
데이터를 배치로 처리함으로써 효율적이고 빠르게 처리할 수 있습니다.
아래는 y_batch와 p의 과정에 대해 쉽게 이해할 수 있는 코드입니다.
'AI > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
[ Chapter.04 ] 수치 미분 (0) | 2022.08.01 |
---|---|
[ Chapter.04 ] 손실 함수 (0) | 2022.07.31 |
[ Chapter.04 ] 신경망 학습 (0) | 2022.07.28 |
[ Chapter.03 ] 퍼셉트론에서 신경망으로 (0) | 2022.07.28 |
[ Chapter.02 ] 퍼셉트론 (0) | 2022.06.28 |