본문 바로가기
프로그래머/프로그래밍

[케라스] Keras 숫자 인식 샘플

by plog 2019. 12. 16.

* 김태영님 동영상(https://youtu.be/cJpjAmRO_h8) 강의 정리 노트 
* 참고: 김태영님 블로그(https://tykimos.github.io/)

 

코랩(colab) 이란?

코랩은 구글에서 교육과 과학 연구를 목적으로 개발한 도구이며, 무료로 공개하였습니다. 코랩에서 파이썬 코드를 작성 및 실행 할 수 있습니다. 

https://colab.research.google.com/

 

코랩 실행하기

왼쪽 상단 파일 >> 새 Python3노트..... 에디터 실행후 예제 코드 삽입 하고 실행 버튼을 누른다. 

 

예제코드

############### 0. 사용할 패키지 불러오기 ###############
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation

############### 1. 데이터셋 생성하기 ############### 
# 아마존에서 자동으로 mnist 파일 다운로드 
(x_train, y_train), (x_test, y_test) = mnist.load_data() 

# 784 byte 크기의 7만개의 샘플 사용. 
# 6만개는 학습(train) 사용 1만개는 테스트 사용
# 255으로 나누어 정규화를 진행.(이미지 픽셀값 범위 0~255)
# 0 ~ 1 사이 수치로 변환. (학습 효과를 높이기 위해)
x_train = x_train.reshape(60000, 784).astype('float32') / 255.0
x_test = x_test.reshape(10000, 784).astype('float32') / 255.0

# np_utils.to_categorical 함수는 원핫인코딩(One-hot encoding) 한다. 
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)


################ 2. 모델 구성하기 ############### 
model = Sequential()
model.add(Dense(units=64, input_dim=28*28, activation='relu'))

# activation='softmax' -> 시그모이드(Sigmoid) 합이 1이된다. 
model.add(Dense(units=10, activation='softmax'))  


################ 3. 모델 학습과정 설정하기 ###############
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])


################ 4. 모델 학습시키기 ###############
# batch_size=32: 32문항 풀고 업데이트
# epoch =5: 5번 반복하여 수행. 
hist = model.fit(x_train, y_train, epochs=5, batch_size=32)


################ 5. 학습과정 살펴보기 ###############
print('## training loss and acc ##')
print(hist.history['loss'])
print(hist.history['acc'])


################ 6. 모델 평가하기 ###############
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=32)
print('## evaluation loss and_metrics ##')
print(loss_and_metrics)


###### 7. 모델 사용하기 정확도 테스트 ###############
xhat = x_test[0:1]
yhat = model.predict(xhat)
print('## yhat ##')
print(yhat)

실행 로그 

epoch=5 설정 되어 있어 5번 실행 

loss= 손실값, acc=정확도 ... 반복 할수록 정확도는 상승

 

60000/60000 [=====================] - 4s 64us/step - loss: 0.6683 - acc: 0.8298
Epoch 2/5
60000/60000 [=====================] - 3s 50us/step - loss: 0.3495 - acc: 0.9025
Epoch 3/5
60000/60000 [=====================] - 3s 50us/step - loss: 0.3008 - acc: 0.9145
Epoch 4/5
60000/60000 [=====================] - 3s 51us/step - loss: 0.2703 - acc: 0.9232
Epoch 5/5
60000/60000 [=====================] - 3s 50us/step - loss: 0.2481 - acc: 0.9292

 

테스트 결과

테스트 샘플(x_test[0:1]) 값이 7 이라고 예측 하고 있다. 

## yhat ##

[[4.0804855e-05 4.7461089e-08 7.8313460e-04 1.4411036e-03 3.7688147e-07

2.7031547e-05 1.3679331e-08 9.9757677e-01 8.6176069e-06 1.2211356e-04]]

 

주요 키워드 

overfit

학습데이터를 과하게 학습하는 것

예) 시험시작 전까지 책을 보는 행위.(김태영님 강좌에서)

 

one-hot encoding

하나의 값만 True이고 나머지는 모두 False인 인코딩을 말한다.

즉, 1개만 Hot(True)이고 나머지는 Cold(False)이다.
예) [0, 0, 0, 0, 1] = 4

 

Dense 클래스 

입출력을 모두 연결해주는 Dense 레이어

Dense(units=64, input_dim=28*28, activation='relu')

  • 첫번째 인자 : 출력 뉴런의 수를 설정.
  • input_dim : 입력 뉴런의 수를 설정.
  • init : 가중치 초기화 방법 설정.
    ‘uniform’ : 균일 분포
    ‘normal’ : 가우시안 분포
  • activation : 활성화 함수 설정.
    ‘linear’ : 디폴트 값, 입력뉴런과 가중치로 계산된 결과값이 그대로 출력.
    ‘relu’ : rectifier 함수, 은익층에 주로 사용.
    ‘sigmoid’ : 시그모이드 함수, 이진 분류 문제에서 출력층에 주로 사용.
    ‘softmax’ : 소프트맥스 함수, 다중 클래스 분류 문제에서 출력층에 사용.

 

 

댓글