Keras implementation for MNIST classification with batch normalization and leaky ReLU.
[code lang="python"]
import numpy as np import time import pandas as pd import matplotlib.pyplot as plt
from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, LeakyReLU, Activation, Flatten from keras.optimizers import Adam from keras.layers.normalization import BatchNormalization from keras.utils import np_utils from keras.layers import Conv2D, MaxPooling2D from keras.utils import plot_model from keras.backend import set_learning_phase, learning_phase
def build_classifier(input_shape, num_classes, num_pooling): """ input_shape = (image_width, image_height, 1) """
settings
kernel_size = (3, 3) pool_size = (2, 2) num_featuremaps = 32 size_featurevector = 1024
Three steps to create a CNN
1. Convolution
2. Activation
3. Pooling
Repeat Steps 1,2,3 for adding more hidden layers
4. After that make a fully connected network
This fully connected network gives ability to the CNN
to classify the samples
model = Sequential()
add convolution blocks num_pooling times for featuremap extraction
for block in range(num_pooling): if block == 0: model.add(Conv2D(num_featuremaps, kernel_size=kernel_size, padding='same', activation='linear', input_shape=input_shape)) else: num_featuremaps *= 2 model.add(Conv2D(num_featuremaps, kernel_size=kernel_size, padding='same', activation='linear')) model.add(BatchNormalization()) model.add(LeakyReLU(0.2))
model.add(Conv2D(num_featuremaps, kernel_size=kernel_size, padding='same', activation='linear')) model.add(BatchNormalization()) model.add(LeakyReLU(0.2))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Flatten())
add fully connected layers for classification
for block in range(num_pooling): model.add(Dense(size_featurevector, activation='linear')) model.add(LeakyReLU(alpha=0.2)) model.add(BatchNormalization()) model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
return model
def demo_load_model(): num_pooling = 3 input_shapes = [(64, 64, 1), (128, 128, 1), (256, 256, 1)] for input_shape in input_shapes: model = build_pointset_classifier(input_shape, 100, num_pooling)
filename = 'pointset_classifier_%s.png' % str(input_shape[0]) plot_model(model, to_file=filename, show_shapes=True)
if name == 'main': """ settings """ img_width = 28 img_height = 28 input_shape = (img_width, img_height, 1) num_classes = 10 num_epoch = 3 size_batch = 100
""" load data """ (x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], img_width, img_height, 1) x_train = x_train.astype('float32') x_train /= 255.0 y_train = np_utils.to_categorical(y_train, num_classes)
x_test = x_test.reshape(x_test.shape[0], img_width, img_height, 1) x_test = x_test.astype('float32') x_test /= 255.0 y_test = np_utils.to_categorical(y_test, num_classes)
""" build neural network """ num_pooling = 2 set_learning_phase(1) model = build_classifier(input_shape, num_classes, num_pooling)
filename = 'classifier_%s.png' % str(input_shape[0]) plot_model(model, to_file=filename, show_shapes=True)
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy']) model.summary() """ train the model """ time_begin = time.clock() history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=num_epoch, batch_size=size_batch, verbose=1) print('Time elapsed: %.0f' % (time.clock() - time_begin))
""" valid the model """ set_learning_phase(0) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) [/code]