In [1]:
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_mldata
import pickle
import os

mnist = fetch_mldata("MNIST original")
X, y = mnist.data / 255., mnist.target
X_train, X_test = X[:60000], X[60000:]
y_train, y_test = y[:60000], y[60000:]

def ae_store_name(hidden_units):
    directory = "storedClassifiers"
    name = "AE_MNIST_"
    for i in hidden_units:
        name += str(i)
        name += "-"
    name = name[:-1]
    name += "_hiddenUnits.p"
    return os.path.join(directory,name)


from keras.layers import Input, Dense
from keras.models import Model

hidden_units = 16  

input_layer = Input(shape=(784,))
hidden = Dense(hidden_units, activation='relu')(input_layer)
output_layer = Dense(784, activation='sigmoid')(hidden)

# maps input to its reconstruction
autoencoder = Model(input_layer, output_layer)
# maps input to encoded or compressed representation
encoder = Model(input_layer, hidden)

autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')



if os.path.isfile(ae_store_name((hidden_units,))):
    autoencoder = pickle.load(open(ae_store_name((hidden_units,)), "rb" ))
else:
    autoencoder.fit(X_train, X_train,
                epochs=50,
                batch_size=256,
                shuffle=True,
                validation_data=(X_test, X_test))

reconstructed_imgs = autoencoder.predict(X_test)


Using TensorFlow backend.
Train on 60000 samples, validate on 10000 samples
Epoch 1/50
60000/60000 [==============================] - 5s - loss: 0.3901 - val_loss: 0.2747
Epoch 2/50
60000/60000 [==============================] - 5s - loss: 0.2696 - val_loss: 0.2620
Epoch 3/50
60000/60000 [==============================] - 5s - loss: 0.2537 - val_loss: 0.2425
Epoch 4/50
60000/60000 [==============================] - 5s - loss: 0.2343 - val_loss: 0.2235
Epoch 5/50
60000/60000 [==============================] - 5s - loss: 0.2175 - val_loss: 0.2087
Epoch 6/50
60000/60000 [==============================] - 5s - loss: 0.2047 - val_loss: 0.1979
Epoch 7/50
60000/60000 [==============================] - 5s - loss: 0.1957 - val_loss: 0.1905
Epoch 8/50
60000/60000 [==============================] - 5s - loss: 0.1891 - val_loss: 0.1848
Epoch 9/50
60000/60000 [==============================] - 5s - loss: 0.1838 - val_loss: 0.1799
Epoch 10/50
60000/60000 [==============================] - 5s - loss: 0.1794 - val_loss: 0.1759
Epoch 11/50
60000/60000 [==============================] - 5s - loss: 0.1758 - val_loss: 0.1726
Epoch 12/50
60000/60000 [==============================] - 5s - loss: 0.1727 - val_loss: 0.1699
Epoch 13/50
60000/60000 [==============================] - 5s - loss: 0.1700 - val_loss: 0.1674
Epoch 14/50
60000/60000 [==============================] - 5s - loss: 0.1676 - val_loss: 0.1650
Epoch 15/50
60000/60000 [==============================] - 5s - loss: 0.1653 - val_loss: 0.1627
Epoch 16/50
60000/60000 [==============================] - 5s - loss: 0.1631 - val_loss: 0.1608
Epoch 17/50
60000/60000 [==============================] - 5s - loss: 0.1610 - val_loss: 0.1585
Epoch 18/50
60000/60000 [==============================] - 5s - loss: 0.1591 - val_loss: 0.1567
Epoch 19/50
60000/60000 [==============================] - 5s - loss: 0.1572 - val_loss: 0.1548
Epoch 20/50
60000/60000 [==============================] - 5s - loss: 0.1556 - val_loss: 0.1533
Epoch 21/50
60000/60000 [==============================] - 5s - loss: 0.1540 - val_loss: 0.1517
Epoch 22/50
60000/60000 [==============================] - 4s - loss: 0.1526 - val_loss: 0.1504
Epoch 23/50
60000/60000 [==============================] - 5s - loss: 0.1513 - val_loss: 0.1491
Epoch 24/50
60000/60000 [==============================] - 5s - loss: 0.1502 - val_loss: 0.1481
Epoch 25/50
60000/60000 [==============================] - 6s - loss: 0.1491 - val_loss: 0.1471
Epoch 26/50
60000/60000 [==============================] - 6s - loss: 0.1481 - val_loss: 0.1460
Epoch 27/50
60000/60000 [==============================] - 5s - loss: 0.1472 - val_loss: 0.1451
Epoch 28/50
60000/60000 [==============================] - 5s - loss: 0.1463 - val_loss: 0.1443
Epoch 29/50
60000/60000 [==============================] - 6s - loss: 0.1455 - val_loss: 0.1434
Epoch 30/50
60000/60000 [==============================] - 5s - loss: 0.1447 - val_loss: 0.1427
Epoch 31/50
60000/60000 [==============================] - 5s - loss: 0.1439 - val_loss: 0.1419
Epoch 32/50
60000/60000 [==============================] - 5s - loss: 0.1432 - val_loss: 0.1412
Epoch 33/50
60000/60000 [==============================] - 5s - loss: 0.1425 - val_loss: 0.1404
Epoch 34/50
60000/60000 [==============================] - 5s - loss: 0.1418 - val_loss: 0.1397
Epoch 35/50
60000/60000 [==============================] - 5s - loss: 0.1411 - val_loss: 0.1390
Epoch 36/50
60000/60000 [==============================] - 5s - loss: 0.1404 - val_loss: 0.1383
Epoch 37/50
60000/60000 [==============================] - 6s - loss: 0.1396 - val_loss: 0.1376
Epoch 38/50
60000/60000 [==============================] - 4s - loss: 0.1389 - val_loss: 0.1369
Epoch 39/50
60000/60000 [==============================] - 4s - loss: 0.1382 - val_loss: 0.1362
Epoch 40/50
60000/60000 [==============================] - 4s - loss: 0.1375 - val_loss: 0.1355
Epoch 41/50
60000/60000 [==============================] - 5s - loss: 0.1369 - val_loss: 0.1349
Epoch 42/50
60000/60000 [==============================] - 5s - loss: 0.1363 - val_loss: 0.1344
Epoch 43/50
60000/60000 [==============================] - 5s - loss: 0.1358 - val_loss: 0.1339
Epoch 44/50
60000/60000 [==============================] - 5s - loss: 0.1354 - val_loss: 0.1335
Epoch 45/50
60000/60000 [==============================] - 5s - loss: 0.1350 - val_loss: 0.1331
Epoch 46/50
60000/60000 [==============================] - 5s - loss: 0.1347 - val_loss: 0.1328
Epoch 47/50
60000/60000 [==============================] - 5s - loss: 0.1344 - val_loss: 0.1325ss: 0
Epoch 48/50
60000/60000 [==============================] - 5s - loss: 0.1341 - val_loss: 0.1322
Epoch 49/50
60000/60000 [==============================] - 5s - loss: 0.1338 - val_loss: 0.1320
Epoch 50/50
60000/60000 [==============================] - 5s - loss: 0.1336 - val_loss: 0.1318

In [2]:
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):
    # display original
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(X_test[y_test==i][0].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(reconstructed_imgs[y_test==i][0].reshape(28, 28))
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.show()