In [1]:
from theano.sandbox import cuda
In [2]:
import utils; reload(utils)
from utils import *
In [3]:
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
Out[3]:
In [4]:
y_train
Out[4]:
In [5]:
y_train = onehot(y_train)
y_test = onehot(y_test)
In [6]:
y_train
Out[6]:
In [7]:
??Lambda
In [8]:
# normalizing the inputs
mean_px = X_train.mean().astype(np.float32)
std_px = X_train.std().astype(np.float32)
def norm_input(x):
return (x-mean_px)/std_px
In [9]:
# adding a depth dimension
X_test = np.expand_dims(X_test, 1)
X_train = np.expand_dims(X_train, 1)
In [10]:
X_train.shape
Out[10]:
In [16]:
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Convolution2D(32, 3, 3,activation='relu'),
BatchNormalization(axis=1),
Convolution2D(32, 3, 3,activation='relu'),
MaxPooling2D(),
BatchNormalization(axis=1),
Convolution2D(64, 3, 3,activation='relu'),
BatchNormalization(axis=1),
Convolution2D(64, 3, 3,activation='relu'),
MaxPooling2D(),
Flatten(),
BatchNormalization(),
Dense(512, activation='relu'),
BatchNormalization(),
Dense(10, activation='softmax')
])
In [17]:
model.summary()
In [18]:
model.compile(Adam(), loss = 'categorical_crossentropy', metrics=['accuracy'])
In [19]:
gen = image.ImageDataGenerator(rotation_range=8, width_shift_range=0.08, shear_range=0.3,
height_shift_range=0.08, zoom_range=0.08)
batches = gen.flow(X_train, y_train, batch_size=64)
test_batches = gen.flow(X_test, y_test, batch_size=64)
In [20]:
model.fit_generator(batches, batches.n, nb_epoch=1, verbose=2, validation_data=test_batches, nb_val_samples=test_batches.n)
Out[20]:
In [21]:
model.optimizer.lr=0.1
model.fit_generator(batches, batches.n, nb_epoch=4, verbose=2, validation_data=test_batches, nb_val_samples=test_batches.n)
Out[21]:
In [22]:
model.optimizer.lr=0.01
In [23]:
model.fit_generator(batches, batches.n, nb_epoch=12,verbose=2, validation_data=test_batches, nb_val_samples=test_batches.n)
Out[23]:
In [24]:
model.optimizer.lr=0.001
In [25]:
model.fit_generator(batches, batches.n, nb_epoch=1,verbose=2, validation_data=test_batches, nb_val_samples=test_batches.n)
Out[25]:
In [ ]: