본문 바로가기
Data scientist/Keras

Keras | Simple MNIST convnet 예제 따라 해보기

by 작은벼리 2020. 12. 8.

 

본 포스팅은 개인 공부를 위해 케라스 공식 사이트(keras.io/about/)에 게재된 내용을 한글로 정리한 것입니다.

 

오늘 정리해볼 예제는 MNIST 데이터셋을 활용해 convnet(합성곱) 딥러닝 모델을 구축하는 sample이다. 

출처: keras.io/examples/vision/mnist_convnet/

 

Keras documentation: Simple MNIST convnet

Simple MNIST convnet Author: fchollet Date created: 2015/06/19 Last modified: 2020/04/21 Description: A simple convnet that achieves ~99% test accuracy on MNIST. View in Colab • GitHub source Setup import numpy as np from tensorflow import keras from ten

keras.io

 

| MNIST 데이터셋

손으로 쓴 숫자 이미지를 모아놓은 데이터셋. 훈련 데이터는 손글씨 이미지이고, 맞추고자 하는 타겟값은 손글씨 이미지의 답이다. 

답은 1 !

 

| 라이브러리 import

 

 

| 데이터 준비

 

1. 0~9까지 타겟 클래스는 10으로 설정 

2. 이미지 데이터는 28*28 픽셀로 구성되어 있고 흑백이므로 1로 설정 (컬러는 3) 

 

3. keras 내장 datasets에서 mnist를 불러와 학습할 데이터 x_train, y_train & 테스트 데이터 x_test, y_test로 나누어 변수에 할당

  -> 데이터셋 기본 구조는 keras. datasets.mnist.load_data()를 입력해보면 하기와 같이 튜플 구조로 이루어져 있음

 

4. x_train과 x_test는 하기와 같이 이미지 내 해당 부분에 픽셀 값으로 나타나 있다. 학습 전에 숫자를 소수점으로 계산 가능하도록 변환해주고, 정규화를 진행해준다. 컬러값을 정규화해주려면 RGB 각 광원의 최댓값인 255로 나눠준다. 

x_train.shape을 찍어보면 (60000, 28, 28)이 나오는데, 28 * 28 픽셀 데이터가 60000개 있다는 의미이다. 

 

5. 이미지 데이터의 구조를 다차원 배열로 변환하기 위해 np.expend_dims() 함수를 써준다 

 

6. y_train 데이터는 0~9까지의 타겟값이고 60000개이다. 

 

7. y_train, y_test 값도 binary 메트릭트로 convert 한다.

이제 y_train과 y_test의 구조는 [1] 대신 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]와 같이 변환되었다. 

 

| 모델 Build

 

1. keras.Sequential으로 모델 인스턴스 만들고

2. 여기서는 Sequential 구조 안에 리스트로 레이어 구조를 짜서 넣어주었다. 

 

3. 모델 summary를 찍어보면 각 단계에서 layer 구성, output shape과 parameter 개수를 확인 가능하다. 

 

| 모델 Train

 

1. 모델 훈련 batch_size와 훈련 횟수 epochs를 설정하고

2. compile()으로 loss와 optimizer, metrics를 설정해주고

3. 이미지 값(x_train)과 타겟 값(y_train), batch_size, epochs, validation_split(훈련 데이터셋에서 10프로를 나눠 validatation 검증 세트로 따로 사용) model.fit()을 진행한다. 

아래와 같이 각 epoch당 loss, accuracy 확인 가능하다. 

 

4. model.evaluate()로 테스트셋으로 남겨놨던 데이터로 모델이 일반화가 잘 되었는지 확인할 수 있다. verbose를 1로 주면 진행 과정도 확인 가능하다. 

 

5. score를 출력해보면 loss와 accuracy를 확인 가능하다.

 

 

댓글