In [17]:
from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
from keras import regularizers

In [2]:
encoding_dim = 32

In [3]:
# input_img = Input(shape=(784, ))

# ## 1 simplest
# #encoded = Dense(encoding_dim, activation='relu')(input_img)

# ## 2 add sparsity constraint
# #encoded = Dense(encoding_dim, activation='relu',
# #               activity_regularizer=regularizers.l1(10e-5))(input_img)
# # decoded = Dense(784, activation='sigmoid')(encoded)

# ## 3 deeper
# encoded = Dense(128, activation='relu')(input_img)
# encoded = Dense(64, activation='relu')(encoded)
# encoded = Dense(32, activation='relu')(encoded)

# decoded = Dense(64, activation='relu')(encoded)
# decoded = Dense(128, activation='relu')(decoded)
# decoded = Dense(784, activation='sigmoid')(decoded)

# autoencoder = Model(input_img, decoded)

In [ ]:
input_img = Input(shape=(28 ,28 , 1))

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)

In [4]:
encoder = Model(input_img, encoded)

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

decoder_layer = autoencoder.layers[-3](encoded_input)
decoder_layer = autoencoder.layers[-2](decoder_layer)
decoder_layer = autoencoder.layers[-1](decoder_layer)

decoder = Model(encoded_input, decoder_layer)

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

In [9]:
from keras.datasets import mnist

In [10]:
import numpy as np

In [11]:
(x_train, _), (x_test, _) = mnist.load_data()

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

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:])))

print(x_train.shape)
print(x_test.shape)


(60000, 784)
(10000, 784)

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


Train on 60000 samples, validate on 10000 samples
Epoch 1/100
60000/60000 [==============================] - 3s 51us/step - loss: 0.3343 - val_loss: 0.2629
Epoch 2/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.2567 - val_loss: 0.2499
Epoch 3/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.2403 - val_loss: 0.2291
Epoch 4/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.2194 - val_loss: 0.2106
Epoch 5/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.2076 - val_loss: 0.2001
Epoch 6/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1977 - val_loss: 0.1922
Epoch 7/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1876 - val_loss: 0.1832
Epoch 8/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1800 - val_loss: 0.1805
Epoch 9/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1735 - val_loss: 0.1696
Epoch 10/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1677 - val_loss: 0.1640
Epoch 11/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1629 - val_loss: 0.1577
Epoch 12/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1587 - val_loss: 0.1549
Epoch 13/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1553 - val_loss: 0.1521
Epoch 14/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1520 - val_loss: 0.1489
Epoch 15/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1494 - val_loss: 0.1482
Epoch 16/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1472 - val_loss: 0.1461
Epoch 17/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1455 - val_loss: 0.1449
Epoch 18/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1440 - val_loss: 0.1429
Epoch 19/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1425 - val_loss: 0.1408
Epoch 20/100
60000/60000 [==============================] - 1s 24us/step - loss: 0.1410 - val_loss: 0.1408
Epoch 21/100
60000/60000 [==============================] - 2s 26us/step - loss: 0.1395 - val_loss: 0.1387
Epoch 22/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1378 - val_loss: 0.1356
Epoch 23/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1362 - val_loss: 0.1332
Epoch 24/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1347 - val_loss: 0.1327
Epoch 25/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1333 - val_loss: 0.1308
Epoch 26/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1317 - val_loss: 0.1299
Epoch 27/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1303 - val_loss: 0.1280
Epoch 28/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1288 - val_loss: 0.1261
Epoch 29/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1275 - val_loss: 0.1254
Epoch 30/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1262 - val_loss: 0.1249
Epoch 31/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1252 - val_loss: 0.1225
Epoch 32/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1243 - val_loss: 0.1223
Epoch 33/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1233 - val_loss: 0.1207
Epoch 34/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1224 - val_loss: 0.1212
Epoch 35/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1220 - val_loss: 0.1200
Epoch 36/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1210 - val_loss: 0.1189
Epoch 37/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1205 - val_loss: 0.1185
Epoch 38/100
60000/60000 [==============================] - 2s 32us/step - loss: 0.1199 - val_loss: 0.1178
Epoch 39/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1193 - val_loss: 0.1177
Epoch 40/100
60000/60000 [==============================] - 2s 27us/step - loss: 0.1187 - val_loss: 0.1187
Epoch 41/100
60000/60000 [==============================] - 2s 28us/step - loss: 0.1181 - val_loss: 0.1163
Epoch 42/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1176 - val_loss: 0.1149
Epoch 43/100
60000/60000 [==============================] - 2s 27us/step - loss: 0.1170 - val_loss: 0.1154
Epoch 44/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1166 - val_loss: 0.1136
Epoch 45/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1162 - val_loss: 0.1166
Epoch 46/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1156 - val_loss: 0.1137
Epoch 47/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1152 - val_loss: 0.1140
Epoch 48/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1148 - val_loss: 0.1153
Epoch 49/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1144 - val_loss: 0.1126
Epoch 50/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1139 - val_loss: 0.1121
Epoch 51/100
60000/60000 [==============================] - 1s 24us/step - loss: 0.1136 - val_loss: 0.1118
Epoch 52/100
60000/60000 [==============================] - 2s 25us/step - loss: 0.1131 - val_loss: 0.1112
Epoch 53/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1127 - val_loss: 0.1124
Epoch 54/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1123 - val_loss: 0.1110
Epoch 55/100
60000/60000 [==============================] - 1s 21us/step - loss: 0.1119 - val_loss: 0.1124
Epoch 56/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1116 - val_loss: 0.1101
Epoch 57/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1113 - val_loss: 0.1088
Epoch 58/100
60000/60000 [==============================] - 2s 26us/step - loss: 0.1109 - val_loss: 0.1099
Epoch 59/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1106 - val_loss: 0.1094
Epoch 60/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1103 - val_loss: 0.1077
Epoch 61/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1099 - val_loss: 0.1084
Epoch 62/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1095 - val_loss: 0.1083
Epoch 63/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1094 - val_loss: 0.1083
Epoch 64/100
60000/60000 [==============================] - 1s 24us/step - loss: 0.1090 - val_loss: 0.1066
Epoch 65/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1087 - val_loss: 0.1089
Epoch 66/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1085 - val_loss: 0.1070
Epoch 67/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1082 - val_loss: 0.1067
Epoch 68/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1079 - val_loss: 0.1062
Epoch 69/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1076 - val_loss: 0.1074
Epoch 70/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1073 - val_loss: 0.1070
Epoch 71/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1071 - val_loss: 0.1064
Epoch 72/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1068 - val_loss: 0.1064
Epoch 73/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1065 - val_loss: 0.1052
Epoch 74/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1062 - val_loss: 0.1062
Epoch 75/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1061 - val_loss: 0.1044
Epoch 76/100
60000/60000 [==============================] - 1s 24us/step - loss: 0.1057 - val_loss: 0.1052
Epoch 77/100
60000/60000 [==============================] - 2s 26us/step - loss: 0.1055 - val_loss: 0.1042
Epoch 78/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1052 - val_loss: 0.1036
Epoch 79/100
60000/60000 [==============================] - 1s 25us/step - loss: 0.1050 - val_loss: 0.1027
Epoch 80/100
60000/60000 [==============================] - 1s 24us/step - loss: 0.1047 - val_loss: 0.1042
Epoch 81/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1044 - val_loss: 0.1031
Epoch 82/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1041 - val_loss: 0.1026
Epoch 83/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1040 - val_loss: 0.1030
Epoch 84/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1038 - val_loss: 0.1032
Epoch 85/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1037 - val_loss: 0.1047
Epoch 86/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1035 - val_loss: 0.1052
Epoch 87/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1032 - val_loss: 0.1026
Epoch 88/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1030 - val_loss: 0.1018
Epoch 89/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1030 - val_loss: 0.1028
Epoch 90/100
60000/60000 [==============================] - 1s 23us/step - loss: 0.1027 - val_loss: 0.1023
Epoch 91/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1026 - val_loss: 0.1014
Epoch 92/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1024 - val_loss: 0.1012
Epoch 93/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1023 - val_loss: 0.1021
Epoch 94/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1022 - val_loss: 0.1009
Epoch 95/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1019 - val_loss: 0.1016
Epoch 96/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1018 - val_loss: 0.1030
Epoch 97/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1016 - val_loss: 0.1006
Epoch 98/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1015 - val_loss: 0.1008
Epoch 99/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1013 - val_loss: 0.1014
Epoch 100/100
60000/60000 [==============================] - 1s 22us/step - loss: 0.1013 - val_loss: 0.1014
Out[13]:
<keras.callbacks.History at 0x1a760d53780>

In [14]:
encoded_imgs = encoder.predict(x_test)

decoded_imgs = decoder.predict(encoded_imgs)

In [15]:
import matplotlib.pyplot as plt

In [16]:
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.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    
    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()



In [ ]: