Autoencoders - part 1

Understanding autoencoders by comparing them to PCA of data clouds

We compare a very basic Autoencoder to PCA.

In part1 we keep the example simple and focus more on becoming familiar with the Keras syntax for setting up this kind of models and to have a feel for how NN Autoencoders differ from linear autoencoders like PCA.

Remember that PCA simply means Eigendecomposition of the covariance:

>>> Cov(data) = V*D*V.T

If you don't keep all the eigenvectors, this gives a low dimensional 'approximation' to the data itself:

>>> data_lowdim = data*V

The approximate data in 'original dimensions' is:

>>> data_approx = data*V*V.T

An Autoencoder is a generalisation of the above where:

>>> data_lowdim = Encode( data  )
>>> data_approx = Decode( data_lowdim )

Where Encode(x) and Decode(x) are potentially nonlinear functions of x.

Of course in PCA, both encoder and decoder are stored in V:

>>> Encode == V 
>>> Decode == V.T


In this tutorial we will:

  • Generate 2 dimensional Gaussian data
  • Fit PCA to the data
  • Fit an autoencoder to the data
  • Play a little bit (but not too much) with the setup of the Autoencoder
In [1]:
# Helper stuff 
# a simple (too simple) PCA class 

import numpy as np

class PCA(object):    
    def __init__(self, data):
        # Assumes data matrix is NumberSamples X NumberDimensions
        self.data = data.copy()
        self.mean = data.mean(axis=0)
        # Demean the data such that cov(data)=data.T*data
        self.data = data-self.mean
        
    def fit(self):        
        #  Eigvectors of covariance
        Cov = data.T@data
        _,V  = np.linalg.eig(Cov)
        # Keep Eigenvectors for use later
        self.V = V
        
    def encode(self,data,dim=1):
        return data@self.V[:,:dim]
    
    def decode(self,data_lowdim):
        dim = data_lowdim.shape[1]
        return data_lowdim@self.V[:,:dim].T
    
    def predict(self,dim=1):
        return self.data@self.V[:,:dim]@self.V[:,:dim].T + self.mean

Generating the data

Below we generate 2D data points from two Gaussian distributions (to add a bit of "nonlinearity")

In [2]:
import numpy as np

n     = 1000
cov   = [[1,.9],[.9,1]]
data1 = np.random.multivariate_normal([-1.1,.1],cov,n)
data2 = np.random.multivariate_normal([1.1,-.1],cov,n)
data  = np.concatenate((data1,data2),axis=0)

# Quickly plot the data
%matplotlib inline 
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(x=data[:,0], y=data[:,1])
plt.axis('equal')
Out[2]:
(-4.250597129712279,
 4.627019384255141,
 -3.3782255716677034,
 4.0209394558643865)

PCA:

Next we do a quick PCA fitting to the data. We keep 1 dimension, and we plot the model prediction.

In [3]:
# do a quick PCA fit

pca = PCA(data)
pca.fit()
pca_pred = pca.predict(dim=1)

# the same can be achieved with:
# pca_pred = pca.decode(pca.encode(data,dim=1))


# quick plot 
sns.scatterplot(x=data[:,0], y=data[:,1])
sns.scatterplot(x=pca_pred[:,0], y=pca_pred[:,1])
plt.legend(('data','PCA'))
Out[3]:
<matplotlib.legend.Legend at 0x12c1aad68>

Autoencoder

Now let us define the Autoencoder model.

We will use a simple feedforward neural network that looks like this:

Input -> Layer -> Layer -> LowDim -> Layer -> Layer -> Output

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


# creates the autoencoder and outputs the encoder and decoder separately as well
def create_AE(input_dim,latent_dim=1):
    
    # Encoder Model
    inputs  = Input(shape=(input_dim,), name='Input')
    x       = Dense(20, activation = 'relu')(inputs)
    x       = Dense(20, activation = 'relu')(x)
    lat     = Dense(latent_dim, activation = 'linear')(x)
    
    encoder = Model(inputs, lat, name='encoder')

    # Decoder model
    lat_input = Input(shape=(latent_dim,))
    x         = Dense(20, activation = 'relu')(lat_input)
    x         = Dense(20, activation = 'relu')(x)
    outputs   = Dense(input_dim, activation = 'linear')(x)
    
    decoder   = Model(lat_input, outputs, name='decoder')
    
    # Autoencoder
    outputs = decoder(encoder(inputs))    
    ae      = Model(inputs, outputs, name='ae')

    return ae,encoder,decoder
Using TensorFlow backend.
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
In [5]:
# Create Autoencoder
ae,enc,dec = create_AE(input_dim=data.shape[1],latent_dim=1)
ae.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Input (InputLayer)           (None, 2)                 0         
_________________________________________________________________
encoder (Model)              (None, 1)                 501       
_________________________________________________________________
decoder (Model)              (None, 2)                 502       
=================================================================
Total params: 1,003
Trainable params: 1,003
Non-trainable params: 0
_________________________________________________________________

Understanding the model parameters

Does it make sense that it has this many parameters?

Let's see.

  • The input data is 2D. So the first transformation is 2x20 params + 20 biases = 60
  • The second is 20x20+20 = 420
  • The third goes to the low dim space: 20x1+1 = 21
  • In the decoder we have 1->20 so it is 1x20+20 = 40
  • Then 20x20+20 = 420
  • Then finally to the output so 20dim->2dim i.e. 20x2+2 = 42

So in total = 60+420+21+40+420+42=1003

Before we start training we need a loss function. For example the one defined below is the mean squared error between input and output:

In [6]:
from keras.losses import mse
from keras import backend as K

def recon_loss(inputs,outputs):
    reconstruction_loss = mse(inputs, outputs)    
    return K.mean(reconstruction_loss)
In [7]:
# Training

# define loss function
losses = {'decoder':recon_loss}

# choose optimisation routine
ae.compile(optimizer='adam',loss=losses)

# run the fitting
ae.fit(data,
        {'decoder':data},
        epochs=200,            
        batch_size=128,shuffle=True)

plt.plot(ae.history.history['loss'])
Epoch 1/200
2000/2000 [==============================] - 0s 220us/step - loss: 1.5440
Epoch 2/200
2000/2000 [==============================] - 0s 10us/step - loss: 1.3955
Epoch 3/200
2000/2000 [==============================] - 0s 14us/step - loss: 1.1771
Epoch 4/200
2000/2000 [==============================] - 0s 14us/step - loss: 0.9184
Epoch 5/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.6787
Epoch 6/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.4469
Epoch 7/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3565
Epoch 8/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3373
Epoch 9/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.3266
Epoch 10/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3217
Epoch 11/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3184
Epoch 12/200
2000/2000 [==============================] - 0s 13us/step - loss: 0.3153
Epoch 13/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3121
Epoch 14/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.3082
Epoch 15/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.3048
Epoch 16/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.3016
Epoch 17/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2982
Epoch 18/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2950
Epoch 19/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2920
Epoch 20/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2891
Epoch 21/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2859
Epoch 22/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2828
Epoch 23/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2800
Epoch 24/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2772
Epoch 25/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2744
Epoch 26/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2717
Epoch 27/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2679
Epoch 28/200
2000/2000 [==============================] - 0s 9us/step - loss: 0.2643
Epoch 29/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2606
Epoch 30/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2566
Epoch 31/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2533
Epoch 32/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2502
Epoch 33/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2461
Epoch 34/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2432
Epoch 35/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2410
Epoch 36/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2384
Epoch 37/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2362
Epoch 38/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2347
Epoch 39/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2315
Epoch 40/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2295
Epoch 41/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2271
Epoch 42/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2269
Epoch 43/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2250
Epoch 44/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2229
Epoch 45/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2204
Epoch 46/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2187
Epoch 47/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2181
Epoch 48/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2176
Epoch 49/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2154
Epoch 50/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2141
Epoch 51/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2126
Epoch 52/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2137
Epoch 53/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2105
Epoch 54/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2089
Epoch 55/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2074
Epoch 56/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2070
Epoch 57/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2076
Epoch 58/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2049
Epoch 59/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2058
Epoch 60/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2040
Epoch 61/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.2033
Epoch 62/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.2013
Epoch 63/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2007
Epoch 64/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.2000
Epoch 65/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1999
Epoch 66/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1981
Epoch 67/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1973
Epoch 68/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1967
Epoch 69/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1952
Epoch 70/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1946
Epoch 71/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1939
Epoch 72/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1933
Epoch 73/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1920
Epoch 74/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1915
Epoch 75/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1906
Epoch 76/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1902
Epoch 77/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1904
Epoch 78/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1899
Epoch 79/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1903
Epoch 80/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1897
Epoch 81/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1892
Epoch 82/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1885
Epoch 83/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1881
Epoch 84/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1882
Epoch 85/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1879
Epoch 86/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1877
Epoch 87/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1858
Epoch 88/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1865
Epoch 89/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1853
Epoch 90/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1853
Epoch 91/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1842
Epoch 92/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1844
Epoch 93/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1834
Epoch 94/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1848
Epoch 95/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1831
Epoch 96/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1827
Epoch 97/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1820
Epoch 98/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1826
Epoch 99/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1832
Epoch 100/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1813
Epoch 101/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1823
Epoch 102/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1809
Epoch 103/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1805
Epoch 104/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1804
Epoch 105/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1803
Epoch 106/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1800
Epoch 107/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1789
Epoch 108/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1790
Epoch 109/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1797
Epoch 110/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1791
Epoch 111/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1789
Epoch 112/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1781
Epoch 113/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1783
Epoch 114/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1777
Epoch 115/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1775
Epoch 116/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1766
Epoch 117/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1765
Epoch 118/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1767
Epoch 119/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1773
Epoch 120/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1769
Epoch 121/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1761
Epoch 122/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1755
Epoch 123/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1752
Epoch 124/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1757
Epoch 125/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1746
Epoch 126/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1751
Epoch 127/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1759
Epoch 128/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1752
Epoch 129/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1741
Epoch 130/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1735
Epoch 131/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1744
Epoch 132/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1735
Epoch 133/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1745
Epoch 134/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1759
Epoch 135/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1739
Epoch 136/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1745
Epoch 137/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1737
Epoch 138/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1730
Epoch 139/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1724
Epoch 140/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1720
Epoch 141/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1721
Epoch 142/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1719
Epoch 143/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1713
Epoch 144/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1707
Epoch 145/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1708
Epoch 146/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1708
Epoch 147/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1709
Epoch 148/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1707
Epoch 149/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1702
Epoch 150/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1696
Epoch 151/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1696
Epoch 152/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1699
Epoch 153/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1710
Epoch 154/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1712
Epoch 155/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1706
Epoch 156/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1715
Epoch 157/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1704
Epoch 158/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1701
Epoch 159/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1692
Epoch 160/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1696
Epoch 161/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1684
Epoch 162/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1684
Epoch 163/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1690
Epoch 164/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1705
Epoch 165/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1697
Epoch 166/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1701
Epoch 167/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1692
Epoch 168/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1681
Epoch 169/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1688
Epoch 170/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1686
Epoch 171/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1673
Epoch 172/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1673
Epoch 173/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1666
Epoch 174/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1663
Epoch 175/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1682
Epoch 176/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1689
Epoch 177/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1680
Epoch 178/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1671
Epoch 179/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1666
Epoch 180/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1657
Epoch 181/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1667
Epoch 182/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1669
Epoch 183/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1659
Epoch 184/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1660
Epoch 185/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1668
Epoch 186/200
2000/2000 [==============================] - 0s 10us/step - loss: 0.1656
Epoch 187/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1652
Epoch 188/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1667
Epoch 189/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1674
Epoch 190/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1657
Epoch 191/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1654
Epoch 192/200
2000/2000 [==============================] - 0s 12us/step - loss: 0.1668
Epoch 193/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1652
Epoch 194/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1651
Epoch 195/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1650
Epoch 196/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1645
Epoch 197/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1663
Epoch 198/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1666
Epoch 199/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1650
Epoch 200/200
2000/2000 [==============================] - 0s 11us/step - loss: 0.1649
Out[7]:
[<matplotlib.lines.Line2D at 0x1384aa898>]

Finally, let's look at the prediction of the Autoencoder and compare it to PCA:

In [8]:
# Look at predictions

out = ae.predict(data)
# equivalently:
# out = dec.predict(enc.predict(data))

import seaborn as sns; sns.set()

sns.scatterplot(x=data[:,0], y=data[:,1])
sns.scatterplot(x=pca_pred[:,0], y=pca_pred[:,1])
sns.scatterplot(x=out[:,0], y=out[:,1])

plt.legend(('data','PCA','AE'))
Out[8]:
<matplotlib.legend.Legend at 0x138473b38>

Observations:

  • It is clear that the AE has more flexibility due to the nonlinearities
  • Because we have chosen ReLU, the 1D autoencoder model has kinks in it. You can try with different nonlinearities (like tanh) to see how that changes.

In part2 we will apply this to the MNIST data.