• This is basic Neural Network Sample
  • Classification of Hand Writing with DeepLearning (Keras)

DeepLearning (MINST)

  • 기존 tensorflow 이 깔려져있다면 1.0으로 업그레이드
  • pip uninstall tensorflow -> pip install tensorflow
import keras
Using TensorFlow backend.
from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
n_train, width, height = x_train.shape
n_train
60000
  • 60000개의 데이터 28x28 pictures
width
28
height
28
n_test, _, _ = x_test.shape
n_test
10000
%matplotlib inline

데이터 보기

import matplotlib.pyplot as plt
plt.imshow(x_train[4,:], cmap='gray')
<matplotlib.image.AxesImage at 0x289fdaec9b0>

png

y_train[4,]
9

데이터 전처리

입력

  • 28x28의 데이터가 60000개가 있다. 3차원
  • 쭉 60000 x 728형태로 변환 시키려고하는 것이다. 점을 순서대로 변환
input_train = x_train.reshape(n_train, width*height) 
input_train.shape
(60000, 784)
input_train.astype('float32')
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]], dtype=float32)
input_train.max()
255
input_train.min()
0
input_train = input_train / 255.0 # 0~1로 데이터로 sacle
input_train.max()
1.0
  • 테스트용 데이터도 동일하게 처리
input_test = x_test.reshape(n_test, width*height)
input_test.astype('float32')
input_test = input_test / 255.0

출력

  • 0이라는 문자가 있다. 왼쪽 반을 지우면 1이된다 하지만 또 반을 지운다고해서 2가 되지는 않는다.
  • 숫자는 범주형 데이터이다. (그림은)
output_train = keras.utils.to_categorical(y_train,10) # 0~9까지를 카테고리로 변환 
output_train # one-hot encoding 
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 1.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  1.,  0.]])
output_test = keras.utils.to_categorical(y_test, 10)

간단한 모델

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import RMSprop
model = Sequential()
model.add(Dense(392, activation='tanh', input_shape=(784,)))
model.add(Dense(10, activation='softmax')) # slide보기 
model.summary() # dense_1 에는 762 * 392 + 392 bias가 있다. 라는 param
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 392)               307720    
_________________________________________________________________
dense_2 (Dense)              (None, 10)                3930      
=================================================================
Total params: 311,650.0
Trainable params: 311,650
Non-trainable params: 0.0
_________________________________________________________________
  • loss : 우리 모델이 얼마나 부정확하냐
  • mean_squared_error : MSE −1/𝑁 ∑(𝑦−𝑦 ̂ )^2
  • cross entropy : 내가 뭔가를 맞출때 높은 확률로 맞춘거를 좋아해, 낮은 확률로 맞춘 것은 loss가 커진다. 배팅을 크게 했는데 못맞추면 loss 또한 커진다.
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

트레이닝

batch_size = 128
epochs = 1
history = model.fit(input_train, output_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(input_test, output_test))
Train on 60000 samples, validate on 10000 samples
Epoch 1/1
60000/60000 [==============================] - 12s - loss: 0.1795 - acc: 0.9496 - val_loss: 0.2409 - val_acc: 0.9372
history.history
{'acc': [0.94961666666666666],
 'loss': [0.1795018165588379],
 'val_acc': [0.93720000000000003],
 'val_loss': [0.24085259833335876]}

평가

score = model.evaluate(input_test, output_test, verbose=0)
score
[0.24085259948968887, 0.93720000000000003]