Skip to content

Instantly share code, notes, and snippets.

@benwu232
Last active July 21, 2016 13:19
Show Gist options
  • Save benwu232/b844646adb0b077ec2a72a08f808283e to your computer and use it in GitHub Desktop.
Save benwu232/b844646adb0b077ec2a72a08f808283e to your computer and use it in GitHub Desktop.
mnist_cnn_test_freeze
from __future__ import print_function
import numpy as np
np.random.seed(1337) # for reproducibility
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.utils import np_utils
batch_size = 128
nb_classes = 10
nb_epoch = 12
# input image dimensions
img_rows, img_cols = 28, 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = 2
# convolution kernel size
nb_conv = 3
# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
import keras
class PerEpoch(keras.callbacks.Callback):
'''Learning rate monitor, monitor the learning rate and change it conditionally
# Arguments
epoch_num: monitor range
shrinkage: shrinkage of learning rate
'''
def __init__(self, model):
self.epoch = []
self.history = {}
self.model = model
def on_train_begin(self, logs={}):
self.epoch = []
self.history = {}
self.pause_cnt = 0
def on_epoch_end(self, epoch, logs={}):
for layer in self.model.layers:
layer.trainable = False
print(self.model.get_weights()[2][1][1])
self.model.compile(optimizer='sgd', loss='categorical_crossentropy')
return
# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
model = Sequential()
model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
border_mode='valid',
input_shape=(1, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
#sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer='sgd', loss='categorical_crossentropy')
#for layer in model.layers:
# layer.trainable = False
per_epoch = PerEpoch(model)
model.fit(X_train[:1000], Y_train[:1000], batch_size=batch_size, nb_epoch=nb_epoch,
show_accuracy=True, verbose=1, validation_data=(X_test, Y_test),
callbacks=[per_epoch])
score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment