본문 바로가기
AI/밑딥

딥러닝) 손글씨 숫자 인식 MNIST 신경망 , 배치 batch 처리

by 채채씨 2021. 2. 18.
728x90
반응형

신경망 구조를 손글씨 숫자 분류 문제를 해결하는데 적용해볼 것이다.

 

기계학습의 문제 풀이는 학습추론 단계를 거친다. 학습 단계에서는 모델을 학습하고, 추론 단계에서는 학습한 모델로  예측해야하는 데이터에 대해 추론을 수행하는 것이다. 

 

신경망도 마찬가지로 두 단계를 거친다. 훈련 데이터를 사용하여 가중치 매개변수를 학습하고, 추론 단계에서는 학습한 매개변수를 사용하여 입력 데이터를 분류한다.

 

이번 포스팅에서는 학습 단계를 생략하고, 순전파(foward propagation)라고도 불리는 '추론 과정'을 구현해볼 것이다.

 

 

 

 

1. MNIST 데이터셋

MNIST dataset은 0~9까지 숫자 이미지 데이터이다. Training dataset은 60,000개이고 Test dataset은 10,000개이다. Training dataset으로 모델을 학습하고, Test dataset으로 학습한 모델이 얼마나 정확하게 분류하는지를 평가할 것이다.

 

 

MNIST 이미지 데이터셋 예시

 

 

github.com/WegraLee/deep-learning-from-scratch 이 링크에서 Download ZIP을 통해 파일들을 다운받는다.

작업할 파일을 ch01, ch02, ... , ch08 중 한 곳에 위치시킨다.

 

 

 

 

load_mnist는 (훈련 이미지, 훈련 레이블), (시험 이미지, 시험 레이블)형식으로 데이터를 반환한다.

인수는 normalize, flatten, one_hot_label 세 가지를 설정할 수 있고, 세 인수 모두 bool(True/False)값이다.

 

normalization -이미지 픽셀값을 0.0~1.0 사이의 값으로 정규화할 것인지 결정
-False로 설정하면 입력 이미지 픽셀값인 0~255사이의 값 유지
flatten -입력 이미지를 1차원 배열로 flat하게 만들 것인지 결정
-False로 설정하면 입력 이미지를 1x28x28인 3차원 배열로, True를 설정하면 784개의 원소로 이루어진 1차원 배열로 저장
one_hot_label -레이블을 one-hot encoding 형태로 저장할 것인지 결정
-one-hot encoding이란, 정답을 뜻하는 원소만 1이고 나머지는 0인 배열로 숫자 2의 경우 [0,0,1,0,0,0,0,0,0,0]로 표현
-False로 설정하면 '2'와 같이 숫자 형태로 레이블을 저장

 

 

 

 

2. 신경망 추론

MNIST데이터셋을 이용하여 추론을 수행하는 신경망을 구현해볼 것이다.

신경망은 입력층 뉴런을 784(28x28)개, 출력층 뉴런을 10개로 구성한다. 첫 번째 은닉층 뉴런은 임의로 50개, 두 번째 은닉층 뉴런은 임의로 100개로 설정한다.

 

 

Import & 은닉층의 activation함수 및 출력층의 softmax함수

 

 

데이터 설정, 파라미터 설정, 예측모델 구현

 

 

test dataset으로 예측 모델의 정확도 평가

 

 

정확도

 

 

 

3. 배치 처리

위에서 구현한 신경망 형상 확인 코드
위신경망 형상 결과

 

위에서 구현한 신경망 형상

 

 

784개의 원소로 구성된 1차원 배열이 입력되어 10개의 원소로 이루어진 1차원 배열이 출력된다. 이것은 이미지 1장을 입력했을 때의 흐름이다.

 

이미지 여러 장을 한번에 입력하는 경우는 다음과 같다. 이미지 100개를 묶어 predict() 함수에 적용하는 것이다. 즉, 100장 분량의 데이터를 하나의 입력 데이터로 표현하는 것이다.

 

 

 

배치 처리한 신경망 형상

 

 

이렇게 입력 데이터를 하나로 묶는 것을(batch)라 한다. 배치 처리를 하는 이유는 컴퓨터에서는 큰 배열을 한 번에 계산하는 것이 작은 배열을 여러 번 계산 하는 것보다 효율적이므로 이미지 1장당 처리 시간을 대폭 줄여주기 때문이다. 배치 처리를 구현하면 다음과 같다.

 

 

 

 

 

axis=1은 첫번째 차원을 구성하는 요소 중 최댓값의 인덱스를 찾도록 하는 인수이다. 예를 들면 다음과 같다.

 

 

axis=1의 예시
결과

 

배치 단위로 분류한 결과를 실제 답과 비교하기 위해, ==연산자를 사용하여 넘파이 배열끼리 비교한다. True/ False로 구성된 bool배열을 만들고, 결과로 True의 개수를 센다.

 

예측값과 실제값 비교하는 방법
결과

 

 

 


 

출처: 사이토 고키, 『밑바닥부터 시작하는 딥러닝, 한빛미디어(2017), p96-106.

https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198

 

 

 

728x90
반응형

댓글