from keras.datasets import mnist
from keras.utils import np_utils
(trainX, trainy), (testX, testy) = mnist.load_data()
# Reshape input from 60000x784 to 60000x1x28x28. (sample_size x channel_num x image_width, image_height)
trainX, testX = [x.reshape(x.shape[0], 1, x.shape[1], x.shape[2]) for x in [trainX, testX]]
trainY, testY = [np_utils.to_categorical(y, 10) for y in [trainy, testy]]
# Scale input
trainX = trainX.astype('float32')
testX = testX.astype('float32')
trainX /= 255
testX /= 255
Using Theano backend.
%matplotlib inline
import matplotlib.pyplot as plt
import random
def fetch_sample_input_for_all_class(class_num, X, y):
def fetch_sample_input_of_class(i):
all_target_class_data = [x for x, cls in zip(X, y) if cls == i]
return random.sample(all_target_class_data, 1)[0]
return [fetch_sample_input_of_class(i) for i in range(class_num)]
plt.figure(figsize=(12, 5))
for cls, data in enumerate(fetch_sample_input_for_all_class(10, testX, testy), start=1):
plt.subplot(2, 5, cls)
plt.imshow(data.reshape(28, 28), cmap="gray")
plt.show()
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense
model = Sequential()
model.add(Convolution2D(32, 3, 3, border_mode="valid", input_shape=(1,28,28)))
model.add(Activation("relu"))
model.add(Convolution2D(32, 3, 3))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer="adadelta", metrics=["accuracy"])
import os
model_file_path = "model_weights.hdf5"
if os.path.exists(model_file_path):
model.load_weights(model_file_path)
else:
model.fit(trainX, trainY, batch_size=128, nb_epoch=1, verbose=1, validation_split=0.1)
print "accuracy = %f" % model.evaluate(testX, testY)[1]
10000/10000 [==============================] - 13s accuracy = 0.973600
from keras import backend as K
cnv1, act1, cnv2, act2, pool, flat, hid1, act3, out, sftmx = model.layers
sftmx_output = K.function([cnv1.input], [sftmx.output])
record = [[None for _ in range(28)] for _ in range(28)]
for i in range(28):
for j in range(28):
X = np.zeros((1,28,28))
X[0][i][j] = 1
record[i][j] = sftmx_output([[X]])[0]
%matplotlib inline
import matplotlib.pyplot as plt
ndrecord = np.array(record).reshape(784, 10)
for i, rec in enumerate(ndrecord.T):
plt.subplot(2,5, i+1)
plt.imshow(rec.reshape(28,28), cmap="gray")
plt.show()