In [1]:
from keras.layers import Dense, Input
from keras.models import Model


Using TensorFlow backend.

In [2]:
encoding_dim = 32

input_img = Input(shape = (784, ))

encoded = Dense(encoding_dim, activation = 'relu')(input_img)

decoded = Dense(784, activation = 'sigmoid')(encoded)

In [3]:
autoencoder = Model(input_img, decoded)

encoder = Model(input_img, encoded)

In [4]:
encoded_input = Input(shape = (encoding_dim, ))

decoder_layer = autoencoder.layers[-1]

decoder = Model(encoded_input, decoder_layer(encoded_input))

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

In [6]:
from keras.datasets import mnist
import numpy as np
(x_train, _), (x_test, _) = mnist.load_data()

In [7]:
x_train


Out[7]:
array([[[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       ...,

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]],

       [[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ...,
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)

In [8]:
x_train = x_train.astype('float32')/255.
x_test = x_test.astype('float32')/255.

In [9]:
x_train = x_train.reshape(len(x_train), np.prod(x_train.shape[1:]))
x_test = x_test.reshape(len(x_test), np.prod(x_test.shape[1:]))

In [10]:
x_train.shape


Out[10]:
(60000, 784)

In [11]:
x_test.shape


Out[11]:
(10000, 784)

In [12]:
autoencoder.fit(x_train, x_train,
               epochs = 50,
               batch_size = 256,
               shuffle = True,
               validation_data = (x_test, x_test))


Train on 60000 samples, validate on 10000 samples
Epoch 1/50
60000/60000 [==============================] - 16s 266us/step - loss: 0.3626 - val_loss: 0.2716
Epoch 2/50
60000/60000 [==============================] - 15s 258us/step - loss: 0.2646 - val_loss: 0.2540
Epoch 3/50
60000/60000 [==============================] - 16s 259us/step - loss: 0.2440 - val_loss: 0.2317
Epoch 4/50
60000/60000 [==============================] - 17s 283us/step - loss: 0.2235 - val_loss: 0.2131
Epoch 5/50
60000/60000 [==============================] - 15s 253us/step - loss: 0.2074 - val_loss: 0.1994
Epoch 6/50
60000/60000 [==============================] - 16s 263us/step - loss: 0.1960 - val_loss: 0.1897
Epoch 7/50
60000/60000 [==============================] - 16s 266us/step - loss: 0.1873 - val_loss: 0.1819
Epoch 8/50
60000/60000 [==============================] - 16s 259us/step - loss: 0.1801 - val_loss: 0.1753
Epoch 9/50
60000/60000 [==============================] - 15s 257us/step - loss: 0.1740 - val_loss: 0.1696
Epoch 10/50
60000/60000 [==============================] - 16s 260us/step - loss: 0.1686 - val_loss: 0.1647
Epoch 11/50
60000/60000 [==============================] - 15s 251us/step - loss: 0.1638 - val_loss: 0.1599
Epoch 12/50
60000/60000 [==============================] - 15s 251us/step - loss: 0.1594 - val_loss: 0.1559
Epoch 13/50
60000/60000 [==============================] - 15s 253us/step - loss: 0.1554 - val_loss: 0.1519
Epoch 14/50
60000/60000 [==============================] - 15s 249us/step - loss: 0.1518 - val_loss: 0.1484
Epoch 15/50
60000/60000 [==============================] - 16s 274us/step - loss: 0.1484 - val_loss: 0.1453
Epoch 16/50
60000/60000 [==============================] - 17s 282us/step - loss: 0.1454 - val_loss: 0.1423
Epoch 17/50
60000/60000 [==============================] - 16s 264us/step - loss: 0.1426 - val_loss: 0.1397
Epoch 18/50
60000/60000 [==============================] - 16s 275us/step - loss: 0.1400 - val_loss: 0.1372
Epoch 19/50
60000/60000 [==============================] - 16s 263us/step - loss: 0.1376 - val_loss: 0.1349
Epoch 20/50
60000/60000 [==============================] - 17s 279us/step - loss: 0.1352 - val_loss: 0.1325
Epoch 21/50
60000/60000 [==============================] - 16s 270us/step - loss: 0.1330 - val_loss: 0.1304
Epoch 22/50
60000/60000 [==============================] - 16s 260us/step - loss: 0.1309 - val_loss: 0.1283
Epoch 23/50
60000/60000 [==============================] - 16s 273us/step - loss: 0.1289 - val_loss: 0.1263
Epoch 24/50
60000/60000 [==============================] - 17s 278us/step - loss: 0.1269 - val_loss: 0.1244
Epoch 25/50
60000/60000 [==============================] - 15s 247us/step - loss: 0.1250 - val_loss: 0.1226
Epoch 26/50
60000/60000 [==============================] - 16s 265us/step - loss: 0.1232 - val_loss: 0.1208
Epoch 27/50
60000/60000 [==============================] - 18s 297us/step - loss: 0.1215 - val_loss: 0.1192
Epoch 28/50
60000/60000 [==============================] - 16s 263us/step - loss: 0.1199 - val_loss: 0.1176
Epoch 29/50
60000/60000 [==============================] - 15s 250us/step - loss: 0.1184 - val_loss: 0.1161
Epoch 30/50
60000/60000 [==============================] - 17s 281us/step - loss: 0.1170 - val_loss: 0.1148
Epoch 31/50
60000/60000 [==============================] - 17s 276us/step - loss: 0.1157 - val_loss: 0.1134
Epoch 32/50
60000/60000 [==============================] - 18s 301us/step - loss: 0.1144 - val_loss: 0.1122
Epoch 33/50
60000/60000 [==============================] - 15s 248us/step - loss: 0.1132 - val_loss: 0.1111
Epoch 34/50
60000/60000 [==============================] - 16s 261us/step - loss: 0.1121 - val_loss: 0.1100
Epoch 35/50
60000/60000 [==============================] - 15s 249us/step - loss: 0.1111 - val_loss: 0.1090
Epoch 36/50
60000/60000 [==============================] - 15s 251us/step - loss: 0.1102 - val_loss: 0.1081
Epoch 37/50
60000/60000 [==============================] - 16s 272us/step - loss: 0.1093 - val_loss: 0.1073
Epoch 38/50
60000/60000 [==============================] - 17s 290us/step - loss: 0.1085 - val_loss: 0.1065
Epoch 39/50
60000/60000 [==============================] - 17s 287us/step - loss: 0.1077 - val_loss: 0.1057
Epoch 40/50
60000/60000 [==============================] - 16s 258us/step - loss: 0.1070 - val_loss: 0.1050
Epoch 41/50
60000/60000 [==============================] - 15s 245us/step - loss: 0.1063 - val_loss: 0.1043
Epoch 42/50
60000/60000 [==============================] - 15s 247us/step - loss: 0.1057 - val_loss: 0.1038
Epoch 43/50
60000/60000 [==============================] - 15s 256us/step - loss: 0.1051 - val_loss: 0.1032
Epoch 44/50
60000/60000 [==============================] - 15s 256us/step - loss: 0.1045 - val_loss: 0.1026
Epoch 45/50
60000/60000 [==============================] - 16s 274us/step - loss: 0.1040 - val_loss: 0.1021
Epoch 46/50
60000/60000 [==============================] - 17s 280us/step - loss: 0.1035 - val_loss: 0.1017
Epoch 47/50
60000/60000 [==============================] - 17s 281us/step - loss: 0.1031 - val_loss: 0.1012
Epoch 48/50
60000/60000 [==============================] - 15s 256us/step - loss: 0.1026 - val_loss: 0.1008
Epoch 49/50
60000/60000 [==============================] - 15s 250us/step - loss: 0.1023 - val_loss: 0.1005
Epoch 50/50
60000/60000 [==============================] - 15s 250us/step - loss: 0.1019 - val_loss: 0.1001
Out[12]:
<keras.callbacks.History at 0xb381e8a90>

In [13]:
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)

In [15]:
import matplotlib.pyplot as plt

n = 10
plt.figure(figsize = (20, 4))
for i in range(n):
    ax = plt.subplot(2, n, i+1)
    plt.imshow(x_test[i].reshape(28, 28))
    plt.gray()
    
    ax = plt.subplot(2, n, i+1 + n)
    plt.imshow(decoded_imgs[i].reshape(28, 28))
    plt.gray()
plt.show()