MNIST (Classification of hand writing using tensorflow(keras))
- 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>
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]