데이터 분석/딥러닝

신경망 적용 ①

교정이 2022. 3. 11. 11:41

MNIST

√ 데이터 셋은 딥러닝 입문에 가장 많이 사용되는 MNIST 데이터 셋을 사용합니다.

√ MINST 데이터 셋은 0~9 숫자를 예측하는 다중 분류 문제입니다. 데이터는 숫자 이미지(28*28)와 각 이미지에 해당하는 레이블(0~9)로 이루어져 있고, 6만개의 학습 데이터와 1만개의 테스트 데이터로 구성되어 있습니다.

 

문제

위의 손글씨 이미지를 몇 %나 정확히 예측할 수 있을까?

 


데이터 전처리

 

불러올 모듈과 seed 값 설정

 

from keras.datasets import mnist

# MNIST 데이터 불러오기
(x_train, y_train), (x_test, y_test) = mnist.load_data()

학습에 사용될 x_train, y_train/ 테스트에 사용될 x_test, y_test로 불러온다.

 

trian set의 데이터 1개의 

28*28의 픽셀로 이루어져 있다. 각 픽셀은 밝기 정도에 빠라 0~255의 값을 가진다.(흰색이 0)

이러한 이미지는 다시 숫자의 집합으로 바뀌어 학습셋으로 사용된다.

28*28 = 784개의 속성을 이용해 0~9까지 10개 클래스 중 하나를 맞히는 문제가 되는 것이다.

 

 

 

1) 다음으로 모델 입력을 위해 주어진 28*28의 2차원 배열을 784개의 1차원 배열 바꿔 줘야 한다.

reshape(총 샘플 수, 1차원 속성의 수) 형식을 사용한다. 총 샘플 수는 앞서 사용한 x_train.shape[0]을 이용하고, 1차원 속성의 수는 784개다.

 

 

2) 케라스는 데이터를 0에서 1사이의 값으로 변환한 다음 구동할 때 최적의 성능을 보인다. 따라서 현재 0~255 사이의 값으로 이루어진 값을 0~1 사이의 값으로 바꿔야 한다. 이처럼 데이터의 폭이 클 때 적절한 값으로 분산의 정도를 바꾸기 위한 데이터 정규화(nomalization)를 진행한다. 정규화를 위해 각 값을 255로 나누어 주려면 이 값을 먼저 실수형으로 바꾸어야 한다. astype()을 사용하여 실수형으로 변환한 뒤 정규화를 진행했다.

 

x_test에도 마찬가지로 이 작업을 적용한다.

 

 

이제 숫자 이미지에 매겨진 이름을 확인한다. 

앞서 불러온 숫자 이미지가 '5'라는 것을 짐작할 수 있는데, 실제로 이 숫자의 레이블이 어떤지를 출력해보니 5가 출력되는 것을 볼 수 있다.

그런데 딥러닝의 분류 문제를 해결하려면 현재 0~9까지의 정수형 값을 갖는 현재 형태에서 0 또는 1로만 이루어진 벡터로 값을 수정해야 한다.(원-핫 인코딩)

 

 

지금 열어본 이미지의 class는 [5] 이므로, 이를 [0,0,0,0,0,1,0,0,0,0] 로 바꿔야 한다. 이를 가능하게 해 주는 함수는 np_utils.to_categorical() 함수이다. to_categorical(클래스, 클래스의 개수)의 형식으로 지정한다.

 


딥러닝 기본 프레임 생성

 

이제 딥러닝을 실행하고자 프레임을 설정한다. 총 784개의 속성이 있고 10개의 클래스가 있다. 따라서 다음과 같이 딥러닝 프레임을 만들 수 있다.

입력 값(input_dim)이 784개, 은닉층이 512개, 출력이 10개인 모델이다.

활성화 함수로 은닉층에서는 relu, 출력층에서는 softmax를 사용했다.

 

 

그 다음으로 딥러닝 실행 환경을 위해 오차 함수로 범주형 크로스엔트로피, 최적화 함수로 adam을 사용했다.

 

 

option) 모델 실행에 앞서 최적화 단계에서 학습을 자동 중단하게끔 설정했다.

 

 

이제 모델을 실행시킨다.

 

샘플 200개를 모두 30번 실행하게끔 설정했다. 그리고 테스트 셋으로 최종 모델의 성과를 측정하여 그 값을 출력했다.

23번 째에 실행이 멈춘 것을 볼 수 있다. 베스트 모델은 14번째 에포크일때이며, 이 모델의 테스트 셋에 대한 정확도는 98% 이다.

 

 

그래프로 나타내 보자.

학습에 대한 오차(trainset_loss)는 계속 줄어든다. 테스트셋(test set)의 과적합이 일어나기 전에 학습을 끝낸 모습이다. 학습 셋의 정확도는 1.00에 가깝고 테스트셋의 오차는 0..00에 가까우므로 두 개를 함께 비교하기가 어렵다. 따라서 1에서 학습셋의 정확도를 뺀 값, 즉 학습셋의 오차를 주로 그래프에 적용하여 이와 같이 표현한다.

'데이터 분석 > 딥러닝' 카테고리의 다른 글

신경망 적용 ③  (0) 2022.03.11
신경망 적용 ②  (0) 2022.03.11
딥러닝 활용_NLP  (0) 2022.03.11
역전파  (0) 2022.03.11
경사하강법  (0) 2022.03.11