1 숫자 필기(MNIST) 데이터

필기숫자 인식 데이터는 Yann LeCun 웹사이트에서 다운로드 받을 수도 있고, 캐글 숫자인식기(Digit Recognizer) 웹사이트에서도 다운로드 받을 수 있고, keras 팩키지를 설치하면 팩키지 내부에 dataset_mnist() 함수를 통해 데이터를 불러올 수 있다.

2 숫자 필기 인식기 개발1

2.1 데이터 가져오기

요즘들어 R 팩키지가 개발되면 유의미한 데이터를 포함시키는 경향이 있다. keras 팩키지에도 숫자 필기(MNIST) 데이터가 포함되어 있다. ? dataset_mnist() 명령어를 실행하면 자세한 데이터에 대한 내용을 확인할 수 있다.

str(mnist_lst) 명령어로 리스트 형태로 train, test로 구분되어 있음이 확인된다.

2.3 데이터 전처리

딥러닝 모형학습 전에 데이터를 훈련데이터와 검증데이터로 구분한다. dataset_mnist() 원본 데이터가 훈련과 검증 데이터로 구분이 되어 있어 이를 활용한다. 그리고, 기계학습을 위해 정규화 과정을 거친다. dataset_mnist() 데이터가 2D 이차원 배열이라, 이를 1차원 배열로 바꾸고 나서 255로 나눠 0 – 1 사이 값으로 정규화시킨다.

훈련데이터로 60,000 개 데이터, 검증데이터로 10,000 개 데이터가 준비되었다. to_categorical() 함수를 통해 종속변수를 One-Hot 인코딩 가변수 변환시킨다.

60000 개: 훈련표본
10000 개: 검증표본

2.4 딥러닝 모형 적합/훈련

훈련데이터와 검증데이터가 모두 준비되었으니, 모형을 초기화하고, 3층 구성을 갖는 신경망 모형을 준비한다. 더불어 손실함수와 측도도 함께 정의한후 fit 함수를 통해 준비한 신경망을 학습시킨다.

신경망 아키텍쳐

중간 dropout 계층과 128개 뉴런을 갖는 계층을 제외하면 이미지(\(28\times 28 = 784\)) 픽셀을 입력으로 받아 256 뉴런에 넣는 계층 하나와 출력으로 0–9까지 숫자 10개 라벨을 갖는 출력 계층으로 단순화할 수 있다.

Model: "sequential"
________________________________________________________________________________
Layer (type)                        Output Shape                    Param #     
================================================================================
dense (Dense)                       (None, 256)                     200960      
________________________________________________________________________________
dropout (Dropout)                   (None, 256)                     0           
________________________________________________________________________________
dense_1 (Dense)                     (None, 128)                     32896       
________________________________________________________________________________
dropout_1 (Dropout)                 (None, 128)                     0           
________________________________________________________________________________
dense_2 (Dense)                     (None, 10)                      1290        
================================================================================
Total params: 235,146
Trainable params: 235,146
Non-trainable params: 0
________________________________________________________________________________
$loss
 [1] 0.49022820 0.21925026 0.16743900 0.13963103 0.11957023 0.10724347
 [7] 0.09775513 0.08946584 0.08341284 0.07795728

$accuracy
 [1] 0.8503750 0.9354375 0.9507292 0.9583958 0.9630000 0.9670625 0.9702708
 [8] 0.9717500 0.9740000 0.9761458

$val_loss
 [1] 0.16820200 0.12418328 0.10922131 0.09696482 0.09177697 0.08403512
 [7] 0.08240505 0.08411978 0.08639239 0.07945904

$val_accuracy
 [1] 0.9508333 0.9640000 0.9683333 0.9715000 0.9713333 0.9750834 0.9754167
 [8] 0.9760833 0.9753333 0.9770000