In [1]:
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, Activation, Flatten, Input
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from joblib import Parallel, delayed
import matplotlib.pyplot as plt
#Seed for reproducibilty
np.random.seed(1338)


Using Theano backend.

In [2]:
%%time
#Loading the training and testing data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255


CPU times: user 1.26 s, sys: 104 ms, total: 1.36 s
Wall time: 1.36 s

In [3]:
%%time
#Selecting 6000 random examples from the test data
test_rows = np.random.randint(0,X_test.shape[0],6000)
X_test = X_test[test_rows]
Y = y_test[test_rows]
#Converting the output to binary classification(Six=1,Not Six=0)
Y_test = Y == 6
Y_test = Y_test.astype(int)

#Selecting the 5918 examples where the output is 6
X_six = X_train[y_train == 6]
Y_six = y_train[y_train == 6]
#Selecting the examples where the output is not 6
X_not_six = X_train[y_train != 6]
Y_not_six = y_train[y_train != 6]

#Selecting 6000 random examples from the data that contains only the data where the output is not 6
random_rows = np.random.randint(0,X_six.shape[0],6000)
X_not_six = X_not_six[random_rows]
Y_not_six = Y_not_six[random_rows]


CPU times: user 48 ms, sys: 20 ms, total: 68 ms
Wall time: 63.2 ms

In [4]:
%%time
#Appending the data with output as 6 and data with output as not six
X_train = np.append(X_six,X_not_six)
#Reshaping the appended data to appropraite form
X_train = X_train.reshape(X_six.shape[0] + X_not_six.shape[0], 784)


CPU times: user 16 ms, sys: 0 ns, total: 16 ms
Wall time: 15.7 ms

In [5]:
%%time
# this is the size of our encoded representations
encoding_dim = 32  # 32 floats -> compression of factor 24.5, assuming the input is 784 floats

# this is our input placeholder
input_img = Input(shape=(784,))
# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='relu')(input_img)
# "decoded" is the lossy reconstruction of the input
decoded = Dense(784, activation='sigmoid')(encoded)

# this model maps an input to its reconstruction
autoencoder = Model(input=input_img, output=decoded)


CPU times: user 4 ms, sys: 4 ms, total: 8 ms
Wall time: 7.15 ms

In [6]:
%%time
# this model maps an input to its encoded representation
encoder = Model(input=input_img, output=encoded)


CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 123 µs

In [7]:
%%time
# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))


CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 898 µs

In [8]:
%%time
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')


CPU times: user 8 ms, sys: 0 ns, total: 8 ms
Wall time: 9.83 ms

In [9]:
%%time
autoencoder.fit(X_train, X_train,
                nb_epoch=50,
                batch_size=256,
                shuffle=True,
                validation_data=(X_test, X_test))


Train on 11918 samples, validate on 6000 samples
Epoch 1/50
11918/11918 [==============================] - 1s - loss: 0.6261 - val_loss: 0.4316
Epoch 2/50
11918/11918 [==============================] - 1s - loss: 0.3130 - val_loss: 0.2993
Epoch 3/50
11918/11918 [==============================] - 1s - loss: 0.2750 - val_loss: 0.2896
Epoch 4/50
11918/11918 [==============================] - 1s - loss: 0.2697 - val_loss: 0.2853
Epoch 5/50
11918/11918 [==============================] - 1s - loss: 0.2669 - val_loss: 0.2835
Epoch 6/50
11918/11918 [==============================] - 1s - loss: 0.2645 - val_loss: 0.2806
Epoch 7/50
11918/11918 [==============================] - 1s - loss: 0.2620 - val_loss: 0.2780
Epoch 8/50
11918/11918 [==============================] - 1s - loss: 0.2590 - val_loss: 0.2741
Epoch 9/50
11918/11918 [==============================] - 1s - loss: 0.2552 - val_loss: 0.2706
Epoch 10/50
11918/11918 [==============================] - 1s - loss: 0.2507 - val_loss: 0.2654
Epoch 11/50
11918/11918 [==============================] - 1s - loss: 0.2457 - val_loss: 0.2607
Epoch 12/50
11918/11918 [==============================] - 1s - loss: 0.2404 - val_loss: 0.2558
Epoch 13/50
11918/11918 [==============================] - 1s - loss: 0.2352 - val_loss: 0.2509
Epoch 14/50
11918/11918 [==============================] - 1s - loss: 0.2303 - val_loss: 0.2462
Epoch 15/50
11918/11918 [==============================] - 1s - loss: 0.2259 - val_loss: 0.2417
Epoch 16/50
11918/11918 [==============================] - 1s - loss: 0.2218 - val_loss: 0.2378
Epoch 17/50
11918/11918 [==============================] - 1s - loss: 0.2180 - val_loss: 0.2342
Epoch 18/50
11918/11918 [==============================] - 1s - loss: 0.2146 - val_loss: 0.2308
Epoch 19/50
11918/11918 [==============================] - 1s - loss: 0.2113 - val_loss: 0.2276
Epoch 20/50
11918/11918 [==============================] - 1s - loss: 0.2083 - val_loss: 0.2245
Epoch 21/50
11918/11918 [==============================] - 1s - loss: 0.2055 - val_loss: 0.2217
Epoch 22/50
11918/11918 [==============================] - 1s - loss: 0.2029 - val_loss: 0.2192
Epoch 23/50
11918/11918 [==============================] - 1s - loss: 0.2004 - val_loss: 0.2166
Epoch 24/50
11918/11918 [==============================] - 1s - loss: 0.1981 - val_loss: 0.2143
Epoch 25/50
11918/11918 [==============================] - 1s - loss: 0.1959 - val_loss: 0.2122
Epoch 26/50
11918/11918 [==============================] - 1s - loss: 0.1939 - val_loss: 0.2101
Epoch 27/50
11918/11918 [==============================] - 1s - loss: 0.1920 - val_loss: 0.2080
Epoch 28/50
11918/11918 [==============================] - 1s - loss: 0.1902 - val_loss: 0.2062
Epoch 29/50
11918/11918 [==============================] - 1s - loss: 0.1885 - val_loss: 0.2043
Epoch 30/50
11918/11918 [==============================] - 1s - loss: 0.1869 - val_loss: 0.2027
Epoch 31/50
11918/11918 [==============================] - 1s - loss: 0.1854 - val_loss: 0.2011
Epoch 32/50
11918/11918 [==============================] - 1s - loss: 0.1839 - val_loss: 0.1995
Epoch 33/50
11918/11918 [==============================] - 1s - loss: 0.1825 - val_loss: 0.1980
Epoch 34/50
11918/11918 [==============================] - 1s - loss: 0.1811 - val_loss: 0.1965
Epoch 35/50
11918/11918 [==============================] - 2s - loss: 0.1798 - val_loss: 0.1951
Epoch 36/50
11918/11918 [==============================] - 1s - loss: 0.1785 - val_loss: 0.1937
Epoch 37/50
11918/11918 [==============================] - 2s - loss: 0.1772 - val_loss: 0.1924
Epoch 38/50
11918/11918 [==============================] - 1s - loss: 0.1760 - val_loss: 0.1911
Epoch 39/50
11918/11918 [==============================] - 2s - loss: 0.1748 - val_loss: 0.1898
Epoch 40/50
11918/11918 [==============================] - 2s - loss: 0.1737 - val_loss: 0.1886
Epoch 41/50
11918/11918 [==============================] - 2s - loss: 0.1726 - val_loss: 0.1874
Epoch 42/50
11918/11918 [==============================] - 2s - loss: 0.1715 - val_loss: 0.1862
Epoch 43/50
11918/11918 [==============================] - 2s - loss: 0.1704 - val_loss: 0.1851
Epoch 44/50
11918/11918 [==============================] - 2s - loss: 0.1694 - val_loss: 0.1839
Epoch 45/50
11918/11918 [==============================] - 2s - loss: 0.1684 - val_loss: 0.1828
Epoch 46/50
11918/11918 [==============================] - 1s - loss: 0.1674 - val_loss: 0.1818
Epoch 47/50
11918/11918 [==============================] - 2s - loss: 0.1664 - val_loss: 0.1808
Epoch 48/50
11918/11918 [==============================] - 2s - loss: 0.1655 - val_loss: 0.1799
Epoch 49/50
11918/11918 [==============================] - 2s - loss: 0.1646 - val_loss: 0.1789
Epoch 50/50
11918/11918 [==============================] - 2s - loss: 0.1637 - val_loss: 0.1781
CPU times: user 3min 3s, sys: 3.12 s, total: 3min 6s
Wall time: 1min 34s
Out[9]:
<keras.callbacks.History at 0x7f0cf52ffd68>

In [10]:
%%time
# encode and decode some digits
# note that we take them from the *test* set
encoder.compile(optimizer='adadelta', loss='binary_crossentropy')
decoder.compile(optimizer='adadelta', loss='binary_crossentropy')
encoded_imgs = encoder.predict(X_test)
decoded_imgs = decoder.predict(encoded_imgs)


CPU times: user 488 ms, sys: 24 ms, total: 512 ms
Wall time: 257 ms

In [11]:
%%time
# use Matplotlib (don't ask)
import matplotlib.pyplot as plt

n = 10  # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
    # display original
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(X_test[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    # display reconstruction
    ax = plt.subplot(2, n, i + 1 + n)
    plt.imshow(decoded_imgs[i].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.show()


CPU times: user 1.4 s, sys: 64 ms, total: 1.47 s
Wall time: 3.43 s

In [ ]: