PCA and autoencoders

  • 此份 Notebook 主要是參考李弘毅的 PCA&AutoEncoder 教學影片,當中部份截圖也是來自老師的投影片當中 連結如下 http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2017/Lecture/PCA.mp4
  • 並且實作投影片中所講到的範例,實際用程式來驗證是否了解演法裡面的細節
  • 實作的部份主要分為兩大部份如下
  • PCA
  • AutoEncoder
    • Simple AutoEncoder
    • Deep AutoEncoder
    • Convolution AutoEncoder
    • VAE AutoEncoder

In [4]:
# Numpy is our primary dependency
import numpy as np

# Import datasets from scikit-learn only to get the iris data set
from sklearn import datasets

# We will need some plotting too
import matplotlib.pyplot as plt


from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook

#假設你要讓每一個 chart inline 獨立顯示
%matplotlib inline

The Dataset

我們使用 sklearn 當中的 MMinst DataSet 作為練習的資料,內容為手寫數字辨識,在各種 Deep Learning Tutorial 中很常出現


In [5]:
from sklearn import datasets
from sklearn import decomposition
import matplotlib.pyplot as plt
import numpy as np


mnist = datasets.load_digits()
X = mnist.data
y = mnist.target

In [6]:
# 他是一個 8*8 影像矩陣
X.shape


Out[6]:
(1797, 64)

In [7]:
print("這個數字 #{}#".format(y[33]))
plt.imshow(X[33].reshape(8,8), interpolation='nearest')
plt.show()


這個數字 #5#

PCA 核心算法精神

  • 因為是要進行 Feature Dimession Reduction,所以先計算各feature間 distribution 的covariance,故先產出 covariance matrix
  • 根據 PCA 的推導過表,可以得知 W 矩陣中的每一個 Vector 互為 orthogonal 即為 orthogonal matrix ,故可以想像成降維後的 feature 間是沒有相依性,白話的就是如果拿這些 feature 進行預測可以使用 linear combination 的 model ,核心精神可以參考下圖
  • 接下對 cov matrix ,求出 eigen_value 及 eigen_vector
  • 直觀的看法如下例這張圖

接下來算出各 Feature間的 covarience matrix(因為要對 Feature 進行降維!!)


In [8]:
# 計算 varience 前,先計算各 feature 的 mean
mean = np.mean(X,axis=0)
# 計算每個一點和 mean 之間的差,及為各資料點的varience
x_x = X-mean

In [9]:
# 計算 covarience matrix
cov = np.matmul(x_x.transpose(),x_x)/mean.shape[0]

In [10]:
# 用 np 的 function 算出 eigenvalue 及 eigevecto
value,vec = np.linalg.eig(cov)

In [11]:
# 確認一下 shape 是否為 8*8 ,因為是計算 feature 間的 covairence
value.shape


Out[11]:
(64,)

In [12]:
# 再來看 eigen_value 遞減佔比,由此可以看出大約前 8 個 componet 就佔了大部份
y_eigen_value = []
for i in range(8*8):
    y_eigen_value.append(value[i]/np.sum(value))

plt.scatter(range(0,8*8), y_eigen_value , cmap=plt.cm.spectral)
plt.show()



In [13]:
# 因為 PCA 產出的值為負到正的浮點數,故需先作平移,才能視覺化成現
new_vec = ((vec+1)*128).astype(int)

In [14]:
# 來看一下 componet

In [15]:
plt.imshow(new_vec[:,0].reshape(8,8), interpolation='nearest')


Out[15]:
<matplotlib.image.AxesImage at 0x7fd194b69a90>

In [16]:
plt.imshow(new_vec[:,1].reshape(8,8), interpolation='nearest')


Out[16]:
<matplotlib.image.AxesImage at 0x7fd194b25b00>

In [17]:
plt.imshow(new_vec[:,2].reshape(8,8), interpolation='nearest')


Out[17]:
<matplotlib.image.AxesImage at 0x7fd194bba828>

In [18]:
# new_X 為降為過後,降成三維
new_X = np.matmul(X,vec[:,:3])
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(new_X[:, 0], new_X[:, 1], new_X[:, 2], c=y, cmap=plt.cm.spectral)
plt.show()



In [19]:
# 將投影的結果,進行 Normalize ,以便好計算兩兩間的 similarity
from sklearn.preprocessing import normalize
new_X_normlized = normalize(new_X)

In [20]:
# 因為進行 normalize 了,故成現球形的分佈
fig2 = plt.figure()
ax2 = fig2.gca(projection='3d')
ax2.scatter(new_X_normlized[:, 0], new_X_normlized[:, 1], new_X_normlized[:, 2], c=y, cmap=plt.cm.spectral)
plt.show()



In [21]:
# 計算看看 similarity

test_index = 333
new_X_normlized

sims = np.matmul(new_X_normlized,new_X_normlized[test_index])

for i in sims.argsort()[-30:][::-1]:
    print("這個數字 #{}#".format(y[i]))
    plt.imshow(X[i].reshape(8,8), interpolation='nearest')
    plt.show()


這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #8#
這個數字 #2#
這個數字 #2#
這個數字 #8#
這個數字 #8#
這個數字 #8#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #1#
這個數字 #8#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #3#
這個數字 #2#
這個數字 #2#
這個數字 #2#
這個數字 #2#

使用現成的套件看看跟我自已算的是否有一樣


In [22]:
pca = decomposition.PCA(n_components=3)
new_X = pca.fit_transform(X)

fig3 = plt.figure()
ax = fig3.gca(projection='3d')
ax.scatter(new_X[:, 0], new_X[:, 1], new_X[:, 2], c=y, cmap=plt.cm.spectral)
plt.show()


Autoencoders by Keras

  • 其實 PCA 降維的動作,就是找出一組 W1 進行空間轉換到另外一個低維度的空間
  • 如果再進一步思考,此降為後的 encoded vector ,再來另外一組 W2,還原成 X
  • PCA另外轉換思考 就是想要 minizie X 轉換前後的差,故可以想像成底下的 auto encoder

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


Using TensorFlow backend.

load data


In [24]:
# 為何要 load 另外一組 dataset 呢,原因是因為要 sklearn 的 data 量太少,經過實驗後無法學到好的 encode 效果
from keras.datasets import mnist
import numpy as np
(x_train, y_train), (x_test, y_test) = mnist.load_data()


Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 53s 5us/step

設計 autoencoder 的 net,一些要點


In [25]:
h1_size = 32
h2_size = 32
input_img = Input(shape=(28*28,))
encoder = Dense(h1_size,activation='relu')(input_img)
hidden = Dense(h2_size,activation='relu')(encoder)
 
# 最後一層的輸出改用 sigmoid ,因為 relu 的出輸結果無法 bound 在 0~1 之間
decoder = Dense(28*28,activation='sigmoid')(hidden)
autoencoder = Model(input_img, decoder)
autoencoder.compile(loss='binary_crossentropy',optimizer='adadelta')

In [26]:
# 由於必需要計算 cross entropy 作 lose function ,x 的值必需要 normalize 到介於 0 到 1 之間
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

# 由於沒有要做 2D Convolution 故 reshape 成一維
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)

training


In [27]:
encoder_model = Model(input_img,encoder)
decoder_model = Model(input_img,decoder)

In [28]:
autoencoder.fit(x_train, x_train,
                epochs=500,
                verbose=2,
                batch_size=256,
                shuffle=True,
                validation_data=(x_test, x_test))


Train on 60000 samples, validate on 10000 samples
Epoch 1/500
 - 3s - loss: 0.3684 - val_loss: 0.2697
Epoch 2/500
 - 1s - loss: 0.2659 - val_loss: 0.2600
Epoch 3/500
 - 1s - loss: 0.2508 - val_loss: 0.2382
Epoch 4/500
 - 1s - loss: 0.2294 - val_loss: 0.2195
Epoch 5/500
 - 1s - loss: 0.2136 - val_loss: 0.2046
Epoch 6/500
 - 1s - loss: 0.1997 - val_loss: 0.1923
Epoch 7/500
 - 1s - loss: 0.1894 - val_loss: 0.1838
Epoch 8/500
 - 1s - loss: 0.1824 - val_loss: 0.1780
Epoch 9/500
 - 1s - loss: 0.1771 - val_loss: 0.1734
Epoch 10/500
 - 1s - loss: 0.1729 - val_loss: 0.1698
Epoch 11/500
 - 1s - loss: 0.1695 - val_loss: 0.1664
Epoch 12/500
 - 1s - loss: 0.1662 - val_loss: 0.1630
Epoch 13/500
 - 1s - loss: 0.1627 - val_loss: 0.1595
Epoch 14/500
 - 1s - loss: 0.1591 - val_loss: 0.1559
Epoch 15/500
 - 1s - loss: 0.1555 - val_loss: 0.1525
Epoch 16/500
 - 1s - loss: 0.1523 - val_loss: 0.1495
Epoch 17/500
 - 1s - loss: 0.1495 - val_loss: 0.1469
Epoch 18/500
 - 1s - loss: 0.1470 - val_loss: 0.1443
Epoch 19/500
 - 1s - loss: 0.1445 - val_loss: 0.1416
Epoch 20/500
 - 1s - loss: 0.1419 - val_loss: 0.1390
Epoch 21/500
 - 1s - loss: 0.1392 - val_loss: 0.1365
Epoch 22/500
 - 1s - loss: 0.1367 - val_loss: 0.1340
Epoch 23/500
 - 1s - loss: 0.1346 - val_loss: 0.1322
Epoch 24/500
 - 1s - loss: 0.1329 - val_loss: 0.1305
Epoch 25/500
 - 1s - loss: 0.1314 - val_loss: 0.1292
Epoch 26/500
 - 1s - loss: 0.1302 - val_loss: 0.1280
Epoch 27/500
 - 1s - loss: 0.1291 - val_loss: 0.1269
Epoch 28/500
 - 1s - loss: 0.1281 - val_loss: 0.1262
Epoch 29/500
 - 1s - loss: 0.1272 - val_loss: 0.1253
Epoch 30/500
 - 1s - loss: 0.1264 - val_loss: 0.1243
Epoch 31/500
 - 1s - loss: 0.1256 - val_loss: 0.1242
Epoch 32/500
 - 1s - loss: 0.1249 - val_loss: 0.1231
Epoch 33/500
 - 1s - loss: 0.1243 - val_loss: 0.1224
Epoch 34/500
 - 1s - loss: 0.1237 - val_loss: 0.1219
Epoch 35/500
 - 1s - loss: 0.1231 - val_loss: 0.1212
Epoch 36/500
 - 1s - loss: 0.1225 - val_loss: 0.1206
Epoch 37/500
 - 1s - loss: 0.1220 - val_loss: 0.1203
Epoch 38/500
 - 1s - loss: 0.1214 - val_loss: 0.1196
Epoch 39/500
 - 1s - loss: 0.1209 - val_loss: 0.1189
Epoch 40/500
 - 1s - loss: 0.1204 - val_loss: 0.1188
Epoch 41/500
 - 1s - loss: 0.1199 - val_loss: 0.1180
Epoch 42/500
 - 1s - loss: 0.1194 - val_loss: 0.1178
Epoch 43/500
 - 1s - loss: 0.1189 - val_loss: 0.1172
Epoch 44/500
 - 1s - loss: 0.1185 - val_loss: 0.1166
Epoch 45/500
 - 1s - loss: 0.1180 - val_loss: 0.1164
Epoch 46/500
 - 1s - loss: 0.1175 - val_loss: 0.1158
Epoch 47/500
 - 1s - loss: 0.1171 - val_loss: 0.1153
Epoch 48/500
 - 1s - loss: 0.1167 - val_loss: 0.1150
Epoch 49/500
 - 1s - loss: 0.1163 - val_loss: 0.1145
Epoch 50/500
 - 1s - loss: 0.1159 - val_loss: 0.1141
Epoch 51/500
 - 1s - loss: 0.1155 - val_loss: 0.1137
Epoch 52/500
 - 1s - loss: 0.1152 - val_loss: 0.1133
Epoch 53/500
 - 1s - loss: 0.1148 - val_loss: 0.1128
Epoch 54/500
 - 1s - loss: 0.1144 - val_loss: 0.1126
Epoch 55/500
 - 1s - loss: 0.1141 - val_loss: 0.1122
Epoch 56/500
 - 1s - loss: 0.1137 - val_loss: 0.1119
Epoch 57/500
 - 1s - loss: 0.1133 - val_loss: 0.1117
Epoch 58/500
 - 1s - loss: 0.1129 - val_loss: 0.1110
Epoch 59/500
 - 1s - loss: 0.1126 - val_loss: 0.1111
Epoch 60/500
 - 1s - loss: 0.1122 - val_loss: 0.1104
Epoch 61/500
 - 1s - loss: 0.1119 - val_loss: 0.1100
Epoch 62/500
 - 1s - loss: 0.1116 - val_loss: 0.1099
Epoch 63/500
 - 1s - loss: 0.1113 - val_loss: 0.1096
Epoch 64/500
 - 1s - loss: 0.1111 - val_loss: 0.1094
Epoch 65/500
 - 1s - loss: 0.1109 - val_loss: 0.1092
Epoch 66/500
 - 1s - loss: 0.1107 - val_loss: 0.1093
Epoch 67/500
 - 1s - loss: 0.1106 - val_loss: 0.1089
Epoch 68/500
 - 1s - loss: 0.1104 - val_loss: 0.1088
Epoch 69/500
 - 1s - loss: 0.1103 - val_loss: 0.1087
Epoch 70/500
 - 1s - loss: 0.1101 - val_loss: 0.1085
Epoch 71/500
 - 1s - loss: 0.1100 - val_loss: 0.1084
Epoch 72/500
 - 1s - loss: 0.1100 - val_loss: 0.1084
Epoch 73/500
 - 1s - loss: 0.1098 - val_loss: 0.1081
Epoch 74/500
 - 1s - loss: 0.1096 - val_loss: 0.1080
Epoch 75/500
 - 1s - loss: 0.1096 - val_loss: 0.1080
Epoch 76/500
 - 1s - loss: 0.1094 - val_loss: 0.1078
Epoch 77/500
 - 1s - loss: 0.1093 - val_loss: 0.1076
Epoch 78/500
 - 1s - loss: 0.1092 - val_loss: 0.1075
Epoch 79/500
 - 1s - loss: 0.1090 - val_loss: 0.1074
Epoch 80/500
 - 1s - loss: 0.1089 - val_loss: 0.1072
Epoch 81/500
 - 1s - loss: 0.1088 - val_loss: 0.1071
Epoch 82/500
 - 1s - loss: 0.1086 - val_loss: 0.1070
Epoch 83/500
 - 1s - loss: 0.1085 - val_loss: 0.1069
Epoch 84/500
 - 1s - loss: 0.1083 - val_loss: 0.1066
Epoch 85/500
 - 1s - loss: 0.1081 - val_loss: 0.1065
Epoch 86/500
 - 1s - loss: 0.1080 - val_loss: 0.1064
Epoch 87/500
 - 1s - loss: 0.1078 - val_loss: 0.1063
Epoch 88/500
 - 1s - loss: 0.1076 - val_loss: 0.1060
Epoch 89/500
 - 1s - loss: 0.1074 - val_loss: 0.1058
Epoch 90/500
 - 1s - loss: 0.1073 - val_loss: 0.1058
Epoch 91/500
 - 1s - loss: 0.1071 - val_loss: 0.1056
Epoch 92/500
 - 1s - loss: 0.1069 - val_loss: 0.1053
Epoch 93/500
 - 1s - loss: 0.1068 - val_loss: 0.1052
Epoch 94/500
 - 1s - loss: 0.1066 - val_loss: 0.1050
Epoch 95/500
 - 1s - loss: 0.1064 - val_loss: 0.1049
Epoch 96/500
 - 1s - loss: 0.1063 - val_loss: 0.1047
Epoch 97/500
 - 1s - loss: 0.1061 - val_loss: 0.1049
Epoch 98/500
 - 1s - loss: 0.1060 - val_loss: 0.1045
Epoch 99/500
 - 1s - loss: 0.1058 - val_loss: 0.1043
Epoch 100/500
 - 1s - loss: 0.1057 - val_loss: 0.1042
Epoch 101/500
 - 1s - loss: 0.1056 - val_loss: 0.1043
Epoch 102/500
 - 1s - loss: 0.1055 - val_loss: 0.1040
Epoch 103/500
 - 1s - loss: 0.1054 - val_loss: 0.1038
Epoch 104/500
 - 1s - loss: 0.1053 - val_loss: 0.1038
Epoch 105/500
 - 1s - loss: 0.1051 - val_loss: 0.1037
Epoch 106/500
 - 1s - loss: 0.1051 - val_loss: 0.1035
Epoch 107/500
 - 1s - loss: 0.1050 - val_loss: 0.1035
Epoch 108/500
 - 1s - loss: 0.1049 - val_loss: 0.1035
Epoch 109/500
 - 1s - loss: 0.1048 - val_loss: 0.1033
Epoch 110/500
 - 1s - loss: 0.1047 - val_loss: 0.1033
Epoch 111/500
 - 1s - loss: 0.1046 - val_loss: 0.1033
Epoch 112/500
 - 1s - loss: 0.1045 - val_loss: 0.1030
Epoch 113/500
 - 1s - loss: 0.1045 - val_loss: 0.1029
Epoch 114/500
 - 1s - loss: 0.1044 - val_loss: 0.1030
Epoch 115/500
 - 1s - loss: 0.1044 - val_loss: 0.1028
Epoch 116/500
 - 1s - loss: 0.1043 - val_loss: 0.1027
Epoch 117/500
 - 1s - loss: 0.1042 - val_loss: 0.1027
Epoch 118/500
 - 1s - loss: 0.1041 - val_loss: 0.1026
Epoch 119/500
 - 1s - loss: 0.1040 - val_loss: 0.1026
Epoch 120/500
 - 1s - loss: 0.1040 - val_loss: 0.1027
Epoch 121/500
 - 1s - loss: 0.1039 - val_loss: 0.1025
Epoch 122/500
 - 1s - loss: 0.1038 - val_loss: 0.1024
Epoch 123/500
 - 1s - loss: 0.1038 - val_loss: 0.1025
Epoch 124/500
 - 1s - loss: 0.1037 - val_loss: 0.1022
Epoch 125/500
 - 1s - loss: 0.1036 - val_loss: 0.1023
Epoch 126/500
 - 1s - loss: 0.1036 - val_loss: 0.1021
Epoch 127/500
 - 1s - loss: 0.1035 - val_loss: 0.1023
Epoch 128/500
 - 1s - loss: 0.1034 - val_loss: 0.1020
Epoch 129/500
 - 1s - loss: 0.1033 - val_loss: 0.1020
Epoch 130/500
 - 1s - loss: 0.1032 - val_loss: 0.1018
Epoch 131/500
 - 1s - loss: 0.1032 - val_loss: 0.1018
Epoch 132/500
 - 1s - loss: 0.1031 - val_loss: 0.1018
Epoch 133/500
 - 1s - loss: 0.1030 - val_loss: 0.1015
Epoch 134/500
 - 1s - loss: 0.1029 - val_loss: 0.1014
Epoch 135/500
 - 1s - loss: 0.1028 - val_loss: 0.1015
Epoch 136/500
 - 1s - loss: 0.1028 - val_loss: 0.1017
Epoch 137/500
 - 1s - loss: 0.1027 - val_loss: 0.1012
Epoch 138/500
 - 1s - loss: 0.1026 - val_loss: 0.1013
Epoch 139/500
 - 1s - loss: 0.1025 - val_loss: 0.1010
Epoch 140/500
 - 1s - loss: 0.1024 - val_loss: 0.1010
Epoch 141/500
 - 1s - loss: 0.1023 - val_loss: 0.1009
Epoch 142/500
 - 1s - loss: 0.1023 - val_loss: 0.1008
Epoch 143/500
 - 1s - loss: 0.1022 - val_loss: 0.1007
Epoch 144/500
 - 1s - loss: 0.1021 - val_loss: 0.1007
Epoch 145/500
 - 1s - loss: 0.1020 - val_loss: 0.1006
Epoch 146/500
 - 1s - loss: 0.1019 - val_loss: 0.1005
Epoch 147/500
 - 1s - loss: 0.1018 - val_loss: 0.1006
Epoch 148/500
 - 1s - loss: 0.1017 - val_loss: 0.1005
Epoch 149/500
 - 1s - loss: 0.1017 - val_loss: 0.1003
Epoch 150/500
 - 1s - loss: 0.1015 - val_loss: 0.1001
Epoch 151/500
 - 1s - loss: 0.1014 - val_loss: 0.1005
Epoch 152/500
 - 1s - loss: 0.1013 - val_loss: 0.0998
Epoch 153/500
 - 1s - loss: 0.1012 - val_loss: 0.0998
Epoch 154/500
 - 1s - loss: 0.1011 - val_loss: 0.0997
Epoch 155/500
 - 1s - loss: 0.1010 - val_loss: 0.0995
Epoch 156/500
 - 1s - loss: 0.1009 - val_loss: 0.0994
Epoch 157/500
 - 1s - loss: 0.1008 - val_loss: 0.0994
Epoch 158/500
 - 1s - loss: 0.1007 - val_loss: 0.0993
Epoch 159/500
 - 1s - loss: 0.1007 - val_loss: 0.0993
Epoch 160/500
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-28-728b23b0e0ef> in <module>()
      5                 batch_size=256,
      6                 shuffle=True,
----> 7                 validation_data=(x_test, x_test))

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
   1629                               initial_epoch=initial_epoch,
   1630                               steps_per_epoch=steps_per_epoch,
-> 1631                               validation_steps=validation_steps)
   1632 
   1633     def evaluate(self, x=None, y=None,

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in _fit_loop(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)
   1211                     batch_logs['size'] = len(batch_ids)
   1212                     callbacks.on_batch_begin(batch_index, batch_logs)
-> 1213                     outs = f(ins_batch)
   1214                     if not isinstance(outs, list):
   1215                         outs = [outs]

/usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   2330         updated = session.run(self.outputs + [self.updates_op],
   2331                               feed_dict=feed_dict,
-> 2332                               **self.session_kwargs)
   2333         return updated[:len(self.outputs)]
   2334 

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    887     try:
    888       result = self._run(None, fetches, feed_dict, options_ptr,
--> 889                          run_metadata_ptr)
    890       if run_metadata:
    891         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1118     if final_fetches or final_targets or (handle and feed_dict_tensor):
   1119       results = self._do_run(handle, final_targets, final_fetches,
-> 1120                              feed_dict_tensor, options, run_metadata)
   1121     else:
   1122       results = []

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
   1315     if handle is None:
   1316       return self._do_call(_run_fn, self._session, feeds, fetches, targets,
-> 1317                            options, run_metadata)
   1318     else:
   1319       return self._do_call(_prun_fn, self._session, handle, feeds, fetches)

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1321   def _do_call(self, fn, *args):
   1322     try:
-> 1323       return fn(*args)
   1324     except errors.OpError as e:
   1325       message = compat.as_text(e.message)

/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata)
   1300           return tf_session.TF_Run(session, options,
   1301                                    feed_dict, fetch_list, target_list,
-> 1302                                    status, run_metadata)
   1303 
   1304     def _prun_fn(session, handle, feed_dict, fetch_list):

KeyboardInterrupt: 

In [29]:
# encode and decode some digits
# note that we take them from the *test* set
# encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder_model.predict(x_test[:100].reshape(100,28*28))

In [ ]:


In [30]:
# 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()



In [31]:
new_X = encoder_model.predict(x_test.reshape(x_test.shape[0],28*28))

In [32]:
new_X = (new_X*255).astype('int32')

In [33]:
import numpy as np
from sklearn.manifold import TSNE
X = new_X[:1000]
X_embedded = TSNE(n_components=3).fit_transform(X)
X_embedded.shape


Out[33]:
(1000, 3)

In [34]:
fig3 = plt.figure()
ax = fig3.gca(projection='3d')
ax.scatter(X_embedded[:, 0], X_embedded[:, 1], X_embedded[:, 2], c=y_test[:1000], cmap=plt.cm.spectral)
plt.show()


Deep AutoEncoder


In [35]:
input_img = Input(shape=(784,))
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)

In [36]:
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

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 [==============================] - 2s 34us/step - loss: 0.3459 - val_loss: 0.2644
Epoch 2/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2595 - val_loss: 0.2531
Epoch 3/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2454 - val_loss: 0.2393
Epoch 4/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2346 - val_loss: 0.2273
Epoch 5/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2244 - val_loss: 0.2200
Epoch 6/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2184 - val_loss: 0.2137
Epoch 7/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.2086 - val_loss: 0.2010
Epoch 8/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1974 - val_loss: 0.1924
Epoch 9/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1896 - val_loss: 0.1847
Epoch 10/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1833 - val_loss: 0.1798
Epoch 11/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1779 - val_loss: 0.1739
Epoch 12/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1729 - val_loss: 0.1697
Epoch 13/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1683 - val_loss: 0.1650
Epoch 14/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1635 - val_loss: 0.1593
Epoch 15/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1593 - val_loss: 0.1558
Epoch 16/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1561 - val_loss: 0.1530
Epoch 17/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1536 - val_loss: 0.1516
Epoch 18/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1513 - val_loss: 0.1483
Epoch 19/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1494 - val_loss: 0.1473
Epoch 20/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1475 - val_loss: 0.1467
Epoch 21/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1458 - val_loss: 0.1433
Epoch 22/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1439 - val_loss: 0.1423
Epoch 23/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1423 - val_loss: 0.1412
Epoch 24/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1407 - val_loss: 0.1390
Epoch 25/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1394 - val_loss: 0.1374
Epoch 26/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1380 - val_loss: 0.1352
Epoch 27/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1366 - val_loss: 0.1355
Epoch 28/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1353 - val_loss: 0.1329
Epoch 29/100
60000/60000 [==============================] - 2s 32us/step - loss: 0.1341 - val_loss: 0.1311
Epoch 30/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1330 - val_loss: 0.1314
Epoch 31/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1317 - val_loss: 0.1305
Epoch 32/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1307 - val_loss: 0.1289
Epoch 33/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1296 - val_loss: 0.1279
Epoch 34/100
60000/60000 [==============================] - 2s 29us/step - loss: 0.1285 - val_loss: 0.1269
Epoch 35/100
60000/60000 [==============================] - 2s 29us/step - loss: 0.1275 - val_loss: 0.1257
Epoch 36/100
60000/60000 [==============================] - 2s 29us/step - loss: 0.1266 - val_loss: 0.1247
Epoch 37/100
60000/60000 [==============================] - 2s 29us/step - loss: 0.1258 - val_loss: 0.1247
Epoch 38/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1249 - val_loss: 0.1247
Epoch 39/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1241 - val_loss: 0.1224
Epoch 40/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1232 - val_loss: 0.1227
Epoch 41/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1224 - val_loss: 0.1221
Epoch 42/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1218 - val_loss: 0.1196
Epoch 43/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1212 - val_loss: 0.1195
Epoch 44/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1206 - val_loss: 0.1200
Epoch 45/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1199 - val_loss: 0.1192
Epoch 46/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1194 - val_loss: 0.1173
Epoch 47/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1187 - val_loss: 0.1176
Epoch 48/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1183 - val_loss: 0.1164
Epoch 49/100
60000/60000 [==============================] - 2s 29us/step - loss: 0.1176 - val_loss: 0.1172
Epoch 50/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1172 - val_loss: 0.1153
Epoch 51/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1166 - val_loss: 0.1143
Epoch 52/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1161 - val_loss: 0.1143
Epoch 53/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1155 - val_loss: 0.1137
Epoch 54/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1151 - val_loss: 0.1130
Epoch 55/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1145 - val_loss: 0.1144
Epoch 56/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1139 - val_loss: 0.1123
Epoch 57/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1135 - val_loss: 0.1121
Epoch 58/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1129 - val_loss: 0.1117
Epoch 59/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1125 - val_loss: 0.1117
Epoch 60/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1120 - val_loss: 0.1109
Epoch 61/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1115 - val_loss: 0.1101
Epoch 62/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1112 - val_loss: 0.1098
Epoch 63/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1106 - val_loss: 0.1097
Epoch 64/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1104 - val_loss: 0.1107
Epoch 65/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1098 - val_loss: 0.1087
Epoch 66/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1095 - val_loss: 0.1075
Epoch 67/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1092 - val_loss: 0.1086
Epoch 68/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1088 - val_loss: 0.1077
Epoch 69/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1084 - val_loss: 0.1074
Epoch 70/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1083 - val_loss: 0.1067
Epoch 71/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1079 - val_loss: 0.1062
Epoch 72/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1076 - val_loss: 0.1066
Epoch 73/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1073 - val_loss: 0.1058
Epoch 74/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1070 - val_loss: 0.1062
Epoch 75/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1068 - val_loss: 0.1079
Epoch 76/100
60000/60000 [==============================] - 2s 30us/step - loss: 0.1065 - val_loss: 0.1042
Epoch 77/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1063 - val_loss: 0.1052
Epoch 78/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1060 - val_loss: 0.1045
Epoch 79/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1057 - val_loss: 0.1043
Epoch 80/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1055 - val_loss: 0.1040
Epoch 81/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1052 - val_loss: 0.1035
Epoch 82/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1050 - val_loss: 0.1040
Epoch 83/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1048 - val_loss: 0.1033
Epoch 84/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1045 - val_loss: 0.1027
Epoch 85/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1043 - val_loss: 0.1025
Epoch 86/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1040 - val_loss: 0.1026
Epoch 87/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1039 - val_loss: 0.1038
Epoch 88/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1036 - val_loss: 0.1034
Epoch 89/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1034 - val_loss: 0.1037
Epoch 90/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1033 - val_loss: 0.1020
Epoch 91/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1031 - val_loss: 0.1014
Epoch 92/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1028 - val_loss: 0.1013
Epoch 93/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1026 - val_loss: 0.1023
Epoch 94/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1024 - val_loss: 0.1003
Epoch 95/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1022 - val_loss: 0.1018
Epoch 96/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1020 - val_loss: 0.1002
Epoch 97/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1018 - val_loss: 0.1007
Epoch 98/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1016 - val_loss: 0.1009
Epoch 99/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1013 - val_loss: 0.1008
Epoch 100/100
60000/60000 [==============================] - 2s 31us/step - loss: 0.1013 - val_loss: 0.1008
Out[36]:
<keras.callbacks.History at 0x7fd194c01c88>

In [37]:
decoded_imgs = autoencoder.predict(x_test[:100].reshape(100,28*28))

In [38]:
# 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()


Convolutional AutoEncoder


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

In [40]:
input_img = Input([28*28])
reshape_img = Reshape([28,28,1])(input_img)

conv1 = Conv2D(16,[3,3],padding='same')(reshape_img)
maxpool1 = MaxPooling2D([2,2])(conv1)

conv2 = Conv2D(8,[3,3],padding='same')(maxpool1)
maxpool2 = MaxPooling2D((2, 2), padding='same')(conv2)

conv3 = Conv2D(8, (3, 3), activation='relu', padding='same')(maxpool2)
maxpool3 = MaxPooling2D((2, 2), padding='same')(conv3)
encoder = Model(input_img,maxpool3)

# encoder.compile(optimizer='adadelta', loss='binary_crossentropy')
encoder.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 784)               0         
_________________________________________________________________
reshape_1 (Reshape)          (None, 28, 28, 1)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 28, 28, 16)        160       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 8)         1160      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 8)           0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 7, 7, 8)           584       
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8)           0         
=================================================================
Total params: 1,904
Trainable params: 1,904
Non-trainable params: 0
_________________________________________________________________

In [41]:
re_conv1 = Conv2D(8, (3, 3), activation='relu', padding='same')(maxpool3)
up1 = UpSampling2D((2, 2))(re_conv1)


re_conv2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(re_conv2)

re_conv3 = Conv2D(16, (3, 3), activation='relu')(up2)
up3 = UpSampling2D((2, 2))(re_conv3)


re_conv4 = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)

reshape_img2 = Reshape([28*28])(re_conv4)

decoder = Model(input_img,reshape_img2)
decoder.summary()


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 784)               0         
_________________________________________________________________
reshape_1 (Reshape)          (None, 28, 28, 1)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 28, 28, 16)        160       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 8)         1160      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 8)           0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 7, 7, 8)           584       
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8)           0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 4, 4, 8)           584       
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 8, 8, 8)           0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 8, 8, 8)           584       
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 16, 16, 8)         0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 14, 14, 16)        1168      
_________________________________________________________________
up_sampling2d_3 (UpSampling2 (None, 28, 28, 16)        0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 28, 28, 1)         145       
_________________________________________________________________
reshape_2 (Reshape)          (None, 784)               0         
=================================================================
Total params: 4,385
Trainable params: 4,385
Non-trainable params: 0
_________________________________________________________________

In [42]:
from keras.callbacks import TensorBoard

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=128,
                shuffle=True,
                validation_data=(x_test, x_test),
                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])


Train on 60000 samples, validate on 10000 samples
Epoch 1/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.1007 - val_loss: 0.0990
Epoch 2/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.1002 - val_loss: 0.0991
Epoch 3/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0999 - val_loss: 0.0981
Epoch 4/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0995 - val_loss: 0.0983
Epoch 5/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0992 - val_loss: 0.0994
Epoch 6/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0989 - val_loss: 0.0978
Epoch 7/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0987 - val_loss: 0.0978
Epoch 8/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0984 - val_loss: 0.0975
Epoch 9/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0982 - val_loss: 0.0976
Epoch 10/50
60000/60000 [==============================] - 3s 53us/step - loss: 0.0979 - val_loss: 0.0970
Epoch 11/50
60000/60000 [==============================] - 3s 52us/step - loss: 0.0977 - val_loss: 0.0963
Epoch 12/50
60000/60000 [==============================] - 3s 53us/step - loss: 0.0975 - val_loss: 0.0960
Epoch 13/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0973 - val_loss: 0.0962
Epoch 14/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0971 - val_loss: 0.0964
Epoch 15/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0969 - val_loss: 0.0957
Epoch 16/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0967 - val_loss: 0.0954
Epoch 17/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0966 - val_loss: 0.0956
Epoch 18/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0964 - val_loss: 0.0949
Epoch 19/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0963 - val_loss: 0.0961
Epoch 20/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0960 - val_loss: 0.0952
Epoch 21/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0959 - val_loss: 0.0955
Epoch 22/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0957 - val_loss: 0.0947
Epoch 23/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0957 - val_loss: 0.0945
Epoch 24/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0955 - val_loss: 0.0947
Epoch 25/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0952 - val_loss: 0.0948
Epoch 26/50
60000/60000 [==============================] - 3s 53us/step - loss: 0.0952 - val_loss: 0.0950
Epoch 27/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0950 - val_loss: 0.0937
Epoch 28/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0949 - val_loss: 0.0943
Epoch 29/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0947 - val_loss: 0.0935
Epoch 30/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0946 - val_loss: 0.0937
Epoch 31/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0944 - val_loss: 0.0931
Epoch 32/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0943 - val_loss: 0.0948
Epoch 33/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0942 - val_loss: 0.0933
Epoch 34/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0941 - val_loss: 0.0936
Epoch 35/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0940 - val_loss: 0.0932
Epoch 36/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0938 - val_loss: 0.0929
Epoch 37/50
60000/60000 [==============================] - 3s 56us/step - loss: 0.0937 - val_loss: 0.0928
Epoch 38/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0935 - val_loss: 0.0934
Epoch 39/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0934 - val_loss: 0.0918
Epoch 40/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0932 - val_loss: 0.0920
Epoch 41/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0932 - val_loss: 0.0926
Epoch 42/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0931 - val_loss: 0.0917
Epoch 43/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0929 - val_loss: 0.0921
Epoch 44/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0928 - val_loss: 0.0915
Epoch 45/50
60000/60000 [==============================] - 3s 53us/step - loss: 0.0927 - val_loss: 0.0910
Epoch 46/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0926 - val_loss: 0.0920
Epoch 47/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0925 - val_loss: 0.0921
Epoch 48/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0924 - val_loss: 0.0918
Epoch 49/50
60000/60000 [==============================] - 3s 55us/step - loss: 0.0924 - val_loss: 0.0917
Epoch 50/50
60000/60000 [==============================] - 3s 54us/step - loss: 0.0922 - val_loss: 0.0922
Out[42]:
<keras.callbacks.History at 0x7fd0f317bba8>

In [43]:
decoded_imgs = autoencoder.predict(x_test[:100].reshape(100,28*28))   
# 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()



In [44]:
#看一下 encode 分佈的結果

In [45]:
ymaping = [[],[],[],[],[],[],[],[],[],[],]

for idx, val in enumerate(y_test):    
    ymaping[val].append(idx)

In [46]:
test_image = x_test[ymaping[0]]
test_images_encode = encoder.predict(test_image.reshape((test_image.shape[0],28*28)))

In [47]:
test_images_encode.shape


Out[47]:
(980, 4, 4, 8)

In [ ]:


In [48]:
X_embedded = TSNE(n_components=1).fit_transform(test_images_encode.reshape((980,4*4*8)))

In [49]:
sorted_index = np.argsort(X_embedded.reshape(980)).tolist()

In [50]:
plt.figure(figsize=(20, 20)) 
n = len(sorted_index)
for index,value in enumerate(sorted_index):
    if index >= 100 : break

    ax = plt.subplot(10,10, index+1)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    plt.imshow(  x_test[ymaping[0][index]].reshape(28,28)   , interpolation='nearest')
plt.show()


VAE AutoEncoder

  • 基本精神為確保 Encode 後的 laten vector 必需也是一個 Normal Distribution(很大膽的假設)
  • 接下來設 Laten Vector's Distribution 與 Normal Distribution 的 KL Divergence 為 Lose Function
  • 對此 lose function 作 minimize
  • 直觀的說明可以參考 https://sherlockliao.github.io/2017/06/24/vae/

In [51]:
'''This script demonstrates how to build a variational autoencoder with Keras.
Reference: "Auto-Encoding Variational Bayes" https://arxiv.org/abs/1312.6114
'''
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

from keras.layers import Input, Dense, Lambda, Layer
from keras.models import Model
from keras import backend as K
from keras import metrics
from keras.datasets import mnist

batch_size = 100
original_dim = 784
latent_dim = 2
intermediate_dim = 256
epochs = 50
epsilon_std = 1.0

In [52]:
x = Input(shape=(original_dim,))
h = Dense(intermediate_dim, activation='relu')(x)
z_mean = Dense(latent_dim)(h)
z_log_var = Dense(latent_dim)(h)


def sampling(args):
    z_mean, z_log_var = args
    epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim), mean=0.,
                              stddev=epsilon_std)
    return z_mean + K.exp(z_log_var / 2) * epsilon

# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var])

# we instantiate these layers separately so as to reuse them later
decoder_h = Dense(intermediate_dim, activation='relu')
decoder_mean = Dense(original_dim, activation='sigmoid')
h_decoded = decoder_h(z)
x_decoded_mean = decoder_mean(h_decoded)

In [53]:
# Custom loss layer
class CustomVariationalLayer(Layer):
    def __init__(self, **kwargs):
        self.is_placeholder = True
        super(CustomVariationalLayer, self).__init__(**kwargs)

    def vae_loss(self, x, x_decoded_mean):
        xent_loss = original_dim * metrics.binary_crossentropy(x, x_decoded_mean)
        kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
        return K.mean(xent_loss + kl_loss)

    def call(self, inputs):
        x = inputs[0]
        x_decoded_mean = inputs[1]
        loss = self.vae_loss(x, x_decoded_mean)
        self.add_loss(loss, inputs=inputs)
        # We won't actually use the output.
        return x

y = CustomVariationalLayer()([x, x_decoded_mean])
vae = Model(x, y)
vae.compile(optimizer='rmsprop', loss=None)


/usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:22: UserWarning: Output "custom_variational_layer_1" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to "custom_variational_layer_1" during training.

In [54]:
# train the VAE on MNIST digits
(x_train, y_train), (x_test, y_test) = mnist.load_data()

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

vae.fit(x_train,
        shuffle=True,
        epochs=epochs,
        batch_size=batch_size,
        validation_data=(x_test, None))

# build a model to project inputs on the latent space
encoder = Model(x, z_mean)


Train on 60000 samples, validate on 10000 samples
Epoch 1/50
60000/60000 [==============================] - 3s 56us/step - loss: 189.0181 - val_loss: 172.4034
Epoch 2/50
60000/60000 [==============================] - 3s 53us/step - loss: 169.5904 - val_loss: 168.4337
Epoch 3/50
60000/60000 [==============================] - 3s 52us/step - loss: 166.0541 - val_loss: 164.8777
Epoch 4/50
60000/60000 [==============================] - 3s 52us/step - loss: 163.7728 - val_loss: 163.0374
Epoch 5/50
60000/60000 [==============================] - 3s 52us/step - loss: 161.9266 - val_loss: 161.6456
Epoch 6/50
60000/60000 [==============================] - 3s 52us/step - loss: 160.4076 - val_loss: 159.9622
Epoch 7/50
60000/60000 [==============================] - 3s 52us/step - loss: 159.2036 - val_loss: 158.8771
Epoch 8/50
60000/60000 [==============================] - 3s 52us/step - loss: 158.2732 - val_loss: 158.3070
Epoch 9/50
60000/60000 [==============================] - 3s 52us/step - loss: 157.5200 - val_loss: 157.7699
Epoch 10/50
60000/60000 [==============================] - 3s 52us/step - loss: 156.9029 - val_loss: 157.0804
Epoch 11/50
60000/60000 [==============================] - 3s 52us/step - loss: 156.3443 - val_loss: 156.8217
Epoch 12/50
60000/60000 [==============================] - 3s 52us/step - loss: 155.8977 - val_loss: 156.5006
Epoch 13/50
60000/60000 [==============================] - 3s 53us/step - loss: 155.4448 - val_loss: 156.2565
Epoch 14/50
60000/60000 [==============================] - 3s 52us/step - loss: 155.0911 - val_loss: 156.4220
Epoch 15/50
60000/60000 [==============================] - 3s 51us/step - loss: 154.7521 - val_loss: 155.1953
Epoch 16/50
60000/60000 [==============================] - 3s 51us/step - loss: 154.4204 - val_loss: 154.9494
Epoch 17/50
60000/60000 [==============================] - 3s 52us/step - loss: 154.1589 - val_loss: 154.5331
Epoch 18/50
60000/60000 [==============================] - 3s 52us/step - loss: 153.8992 - val_loss: 154.4291
Epoch 19/50
60000/60000 [==============================] - 3s 52us/step - loss: 153.6448 - val_loss: 154.3884
Epoch 20/50
60000/60000 [==============================] - 3s 52us/step - loss: 153.3725 - val_loss: 154.0884
Epoch 21/50
60000/60000 [==============================] - 3s 52us/step - loss: 153.1873 - val_loss: 153.9488
Epoch 22/50
60000/60000 [==============================] - 3s 52us/step - loss: 152.9865 - val_loss: 153.6795
Epoch 23/50
60000/60000 [==============================] - 3s 52us/step - loss: 152.7858 - val_loss: 154.2876
Epoch 24/50
60000/60000 [==============================] - 3s 53us/step - loss: 152.6048 - val_loss: 153.4077
Epoch 25/50
60000/60000 [==============================] - 3s 52us/step - loss: 152.3861 - val_loss: 153.5855
Epoch 26/50
60000/60000 [==============================] - 3s 52us/step - loss: 152.2388 - val_loss: 153.1396
Epoch 27/50
60000/60000 [==============================] - 3s 52us/step - loss: 152.0838 - val_loss: 153.1417
Epoch 28/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.9030 - val_loss: 152.8511
Epoch 29/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.7562 - val_loss: 153.0738
Epoch 30/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.6286 - val_loss: 153.2457
Epoch 31/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.4820 - val_loss: 152.8849
Epoch 32/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.3628 - val_loss: 152.4146
Epoch 33/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.1931 - val_loss: 152.6095
Epoch 34/50
60000/60000 [==============================] - 3s 52us/step - loss: 151.0956 - val_loss: 152.6917
Epoch 35/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.9663 - val_loss: 152.3700
Epoch 36/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.8002 - val_loss: 152.2172
Epoch 37/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.7064 - val_loss: 152.0517
Epoch 38/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.5870 - val_loss: 152.2440
Epoch 39/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.4570 - val_loss: 152.3588
Epoch 40/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.3598 - val_loss: 152.1831
Epoch 41/50
60000/60000 [==============================] - 3s 53us/step - loss: 150.2564 - val_loss: 152.0486
Epoch 42/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.1430 - val_loss: 151.9260
Epoch 43/50
60000/60000 [==============================] - 3s 52us/step - loss: 150.0584 - val_loss: 151.9340
Epoch 44/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.9477 - val_loss: 151.8639
Epoch 45/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.8787 - val_loss: 151.6074
Epoch 46/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.7701 - val_loss: 151.8758
Epoch 47/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.6519 - val_loss: 151.5271
Epoch 48/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.5657 - val_loss: 151.9513
Epoch 49/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.4897 - val_loss: 151.4137
Epoch 50/50
60000/60000 [==============================] - 3s 52us/step - loss: 149.4138 - val_loss: 151.3221

In [55]:
# display a 2D plot of the digit classes in the latent space
x_test_encoded = encoder.predict(x_test, batch_size=batch_size)
plt.figure(figsize=(6, 6))
plt.scatter(x_test_encoded[:, 0], x_test_encoded[:, 1], c=y_test)
plt.colorbar()
plt.show()



In [56]:
# build a digit generator that can sample from the learned distribution
decoder_input = Input(shape=(latent_dim,))
_h_decoded = decoder_h(decoder_input)
_x_decoded_mean = decoder_mean(_h_decoded)
generator = Model(decoder_input, _x_decoded_mean)

In [57]:
decoded_imgs = vae.predict(x_train[:100])

In [58]:
# 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_train[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()



In [59]:
# display a 2D manifold of the digits
n = 15  # figure with 15x15 digits
digit_size = 28
figure = np.zeros((digit_size * n, digit_size * n))
# linearly spaced coordinates on the unit square were transformed through the inverse CDF (ppf) of the Gaussian
# to produce values of the latent variables z, since the prior of the latent space is Gaussian
grid_x = norm.ppf(np.linspace(0.05, 0.95, n))
grid_y = norm.ppf(np.linspace(0.05, 0.95, n))

for i, yi in enumerate(grid_x):
    for j, xi in enumerate(grid_y):
        z_sample = np.array([[xi, yi]])
        x_decoded = generator.predict(z_sample)
        digit = x_decoded[0].reshape(digit_size, digit_size)
        figure[i * digit_size: (i + 1) * digit_size,
               j * digit_size: (j + 1) * digit_size] = digit

plt.figure(figsize=(10, 10))
plt.imshow(figure, cmap='Greys_r')
plt.show()



In [ ]:


In [ ]: