In [1]:
from __future__ import division, print_function
%matplotlib inline
from importlib import reload # Python 3
import utils; reload(utils)
from utils import *
In [2]:
batch_size=64
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]:
X_test = np.expand_dims(X_test,1)
X_train = np.expand_dims(X_train,1)
In [5]:
X_train.shape
Out[5]:
In [6]:
y_train[:5]
Out[6]:
In [7]:
y_train = onehot(y_train)
y_test = onehot(y_test)
In [8]:
y_train[:5]
Out[8]:
In [9]:
mean_px = X_train.mean().astype(np.float32)
std_px = X_train.std().astype(np.float32)
In [10]:
def norm_input(x): return (x-mean_px)/std_px
In [11]:
def get_lin_model():
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Flatten(),
Dense(10, activation='softmax')
])
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [12]:
lm = get_lin_model()
In [13]:
gen = image.ImageDataGenerator()
batches = gen.flow(X_train, y_train, batch_size=batch_size)
test_batches = gen.flow(X_test, y_test, batch_size=batch_size)
steps_per_epoch = int(np.ceil(batches.n/batch_size))
validation_steps = int(np.ceil(test_batches.n/batch_size))
In [14]:
lm.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[14]:
In [15]:
lm.optimizer.lr=0.1
In [16]:
lm.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[16]:
In [17]:
lm.optimizer.lr=0.01
In [18]:
lm.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[18]:
In [19]:
def get_fc_model():
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Flatten(),
Dense(512, activation='softmax'),
Dense(10, activation='softmax')
])
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [20]:
fc = get_fc_model()
In [21]:
fc.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[21]:
In [22]:
fc.optimizer.lr=0.1
In [23]:
fc.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[23]:
In [24]:
fc.optimizer.lr=0.01
In [25]:
fc.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[25]:
In [26]:
def get_model():
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Conv2D(32,(3,3), activation='relu'),
Conv2D(32,(3,3), activation='relu'),
MaxPooling2D(),
Conv2D(64,(3,3), activation='relu'),
Conv2D(64,(3,3), activation='relu'),
MaxPooling2D(),
Flatten(),
Dense(512, activation='relu'),
Dense(10, activation='softmax')
])
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [27]:
model = get_model()
In [28]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[28]:
In [29]:
model.optimizer.lr=0.1
In [30]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[30]:
In [31]:
model.optimizer.lr=0.01
In [32]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=8,
validation_data=test_batches, validation_steps=validation_steps)
Out[32]:
In [33]:
model = get_model()
In [34]:
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=batch_size)
test_batches = gen.flow(X_test, y_test, batch_size=batch_size)
steps_per_epoch = int(np.ceil(batches.n/batch_size))
validation_steps = int(np.ceil(test_batches.n/batch_size))
In [35]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[35]:
In [36]:
model.optimizer.lr=0.1
In [37]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[37]:
In [38]:
model.optimizer.lr=0.01
In [39]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=8,
validation_data=test_batches, validation_steps=validation_steps)
Out[39]:
In [40]:
model.optimizer.lr=0.001
In [41]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=14,
validation_data=test_batches, validation_steps=validation_steps)
Out[41]:
In [42]:
model.optimizer.lr=0.0001
In [43]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=10,
validation_data=test_batches, validation_steps=validation_steps)
Out[43]:
In [44]:
def get_model_bn():
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Conv2D(32,(3,3), activation='relu'),
BatchNormalization(axis=1),
Conv2D(32,(3,3), activation='relu'),
MaxPooling2D(),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu'),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu'),
MaxPooling2D(),
Flatten(),
BatchNormalization(),
Dense(512, activation='relu'),
BatchNormalization(),
Dense(10, activation='softmax')
])
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [45]:
model = get_model_bn()
In [46]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[46]:
In [47]:
model.optimizer.lr=0.1
In [48]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[48]:
In [49]:
model.optimizer.lr=0.01
In [50]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=12,
validation_data=test_batches, validation_steps=validation_steps)
Out[50]:
In [51]:
model.optimizer.lr=0.001
In [52]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=12,
validation_data=test_batches, validation_steps=validation_steps)
Out[52]:
In [53]:
def get_model_bn_do():
model = Sequential([
Lambda(norm_input, input_shape=(1,28,28)),
Conv2D(32,(3,3), activation='relu'),
BatchNormalization(axis=1),
Conv2D(32,(3,3), activation='relu'),
MaxPooling2D(),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu'),
BatchNormalization(axis=1),
Conv2D(64,(3,3), activation='relu'),
MaxPooling2D(),
Flatten(),
BatchNormalization(),
Dense(512, activation='relu'),
BatchNormalization(),
Dropout(0.5),
Dense(10, activation='softmax')
])
model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
In [54]:
model = get_model_bn_do()
In [55]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[55]:
In [56]:
model.optimizer.lr=0.1
In [57]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4,
validation_data=test_batches, validation_steps=validation_steps)
Out[57]:
In [58]:
model.optimizer.lr=0.01
In [59]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=12,
validation_data=test_batches, validation_steps=validation_steps)
Out[59]:
In [60]:
model.optimizer.lr=0.001
In [61]:
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1,
validation_data=test_batches, validation_steps=validation_steps)
Out[61]:
In [62]:
def fit_model():
model = get_model_bn_do()
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=1, verbose=0,
validation_data=test_batches, validation_steps=validation_steps)
model.optimizer.lr=0.1
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=4, verbose=0,
validation_data=test_batches, validation_steps=validation_steps)
model.optimizer.lr=0.01
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=12, verbose=0,
validation_data=test_batches, validation_steps=validation_steps)
model.optimizer.lr=0.001
model.fit_generator(batches, steps_per_epoch=steps_per_epoch, epochs=18, verbose=0,
validation_data=test_batches, validation_steps=validation_steps)
return model
In [63]:
models = [fit_model() for i in range(6)]
In [64]:
import os
user_home = os.path.expanduser('~')
path = os.path.join(user_home, "pj/fastai/data/MNIST_data/")
model_path = path + 'models/'
# path = "data/mnist/"
# model_path = path + 'models/'
In [69]:
for i,m in enumerate(models):
m.save_weights(model_path+'cnn-mnist23-'+str(i)+'.pkl')
In [70]:
eval_batch_size = 256
In [71]:
evals = np.array([m.evaluate(X_test, y_test, batch_size=eval_batch_size) for m in models])
In [72]:
evals.mean(axis=0)
Out[72]:
In [73]:
all_preds = np.stack([m.predict(X_test, batch_size=eval_batch_size) for m in models])
In [74]:
all_preds.shape
Out[74]:
In [75]:
avg_preds = all_preds.mean(axis=0)
In [76]:
keras.metrics.categorical_accuracy(y_test, avg_preds).eval()
Out[76]:
In [ ]: