In [1]:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import optimizers
from tensorflow.keras import utils
In [2]:
# load data
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()

# prepare
x_train, x_test = x_train / 255.0, x_test / 255.0 # normalize
x_train = x_train.reshape(-1, 1, 28, 28)
x_test = x_test.reshape(-1, 1, 28, 28)
y_train_oh = utils.to_categorical(y_train, num_classes = 10) # one-hot encoding
y_test_oh = utils.to_categorical(y_test, num_classes = 10) # one-hot encoding
In [4]:
# build cnn network
model = tf.keras.models.Sequential([
    layers.Convolution2D(filters=32, kernel_size=[5, 5],
                  padding='same', activation = 'relu',
                  input_shape=(1, 28, 28)),
    layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
    layers.Convolution2D(filters=128, kernel_size=[3,3],
                  padding='same', activation = 'relu'),
    layers.MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding='same'),
    layers.Flatten(),
    layers.Dense(1024, activation='relu'),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# compile model
model.compile(optimizer='adam', 
             loss='categorical_crossentropy',
             metrics=['accuracy'])

model.fit(x_train, y_train_oh, epochs=5, batch_size=None) # If unspecified, batch_size will default to 32.
model.evaluate(x_test, y_test_oh)
Epoch 1/5
60000/60000 [==============================] - 76s 1ms/sample - loss: 0.1522 - acc: 0.9535
Epoch 2/5
60000/60000 [==============================] - 75s 1ms/sample - loss: 0.0623 - acc: 0.9817
Epoch 3/5
60000/60000 [==============================] - 76s 1ms/sample - loss: 0.0460 - acc: 0.9862
Epoch 4/5
60000/60000 [==============================] - 77s 1ms/sample - loss: 0.0359 - acc: 0.9890
Epoch 5/5
60000/60000 [==============================] - 75s 1ms/sample - loss: 0.0307 - acc: 0.9907
10000/10000 [==============================] - 2s 197us/sample - loss: 0.0511 - acc: 0.9859
Out[4]:
[0.05105495335866217, 0.9859]