Autoencoders Escape the curse of dimensionality.


FEBRUARY 25, 2020

Autoencoders — Escape the curse of dimensionality.


Autoencoders falls under the class of unsupervised learning where the Function tries to mimic itself with some constraints such as pushing the input towards the bottleneck such that it just learns enough significant features of the input data to reconstruct it back with minimal loss

Auto-encoders have three components

First the encoding unit

Second the latent space

Third the decoder unit

In the encoder part, the image is loosing its free dimensions and tries to learn a significant part of the underlying data.

The latent space is the bottleneck layer when the whole image is compressed and represented in minimal dimensions. In the below example conv2d_3 is the bottleneck layer

The decoder unit tries to reconstruct the image which it has learned in the previous layers using upsampling.

Installing Dependencies

pip install keras

Keras is an open-source neural-network library written in Python. It is capable of running on top of TensorFlow, Microsoft Cognitive Toolkit, Theano, or PlaidML. Designed to enable fast experimentation with deep neural networks, it focuses on being user-friendly, modular, and extensible

pip install numpy

NumPy is a library for the Python programming language, adding support for large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays.

pip install matplotlib

Matplotlib is a plotting library for the Python programming language and its numerical mathematics extension NumPy. It provides an object-oriented API for embedding plots into applications using general-purpose GUI toolkits like Tkinter, wxPython, Qt, or GTK+

The acutal coding starts here

Importing Libraries

from IPython.display import Image, SVG
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import keras
from keras.models import Model, Sequential
from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Flatten, Reshape,Dropout
from keras import regularizers

Loads the training and test data sets ignoring class labels since we are using autoencoder we don't need the class labels

from keras.datasets import mnist
(x_train, _), (x_test, _) = mnist.load_data()

Normalization of the input data between to scale it between 0 and 1

max_value = float(x_train.max())
x_train = x_train.astype(‘float32’) / max_value
x_test = x_test.astype(‘float32’) / max_value

Dimension of train and test data


Output: (10000, 28, 28) (60000, 28, 28)

Changing the train and test data to a 4-dimensional tensor as keras expects 4-Dimensional tensor as input

The first dimension is for the number of images

The Second and third is for the width and height for the image

The fourth dimension is for the number of channels

x_train = x_train[:,:,:, None]
x_test = x_test[:,:,:,None]

Output: (10000, 28, 28,1) (60000, 28, 28,1)

Defining the Dimension of the image using Input function in keras

input_img = Input(shape=(28, 28, 1))

Architecture of Encoder

x = Conv2D(16, (3, 3), activation=’relu’, padding=’same’)(input_img)
x = MaxPooling2D((2, 2), padding=’same’)(x)
x = Conv2D(8, (3, 3), activation=’relu’, padding=’same’)(x)
x = MaxPooling2D((2, 2), padding=’same’)(x)
encoded = Conv2D(8, (3, 3), activation=’relu’, padding=’same’)(x)

ReLU layer will apply the function f(x)=max(0,x) in all elements on an input tensor, without changing it’s spatial or depth information and brings nonlinearity to the networks

Architecture of Decoder

x = Conv2D(8, (3, 3), activation=’relu’, padding=’same’)(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation=’relu’, padding=’same’)(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation=’relu’, padding=’same’)(x)
decoded = Conv2D(1, (3, 3), activation=’sigmoid’, padding=’same’)(x)

For the decoder, we use Upsampling from keras instead, as we have to reconstruct the image to its original dimensions.

Defining the model

autoencoder = Model(input_img, decoded)
Output: _________________________________________________________________
Layer (type)                 Output Shape              Param #   
input_1 (InputLayer)         (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       
conv2d_4 (Conv2D)            (None, 7, 7, 8)           584       
up_sampling2d_1 (UpSampling2 (None, 14, 14, 8)         0         
conv2d_5 (Conv2D)            (None, 14, 14, 8)         584       
up_sampling2d_2 (UpSampling2 (None, 28, 28, 8)         0         
conv2d_6 (Conv2D)            (None, 28, 28, 16)        1168      
conv2d_7 (Conv2D)            (None, 28, 28, 1)         145       
Total params: 4,385
Trainable params: 4,385
Non-trainable params: 0

Compiling and Fitting the model

autoencoder.compile(optimizer=’adam’, loss=’mean_squared_error’), x_train,
validation_data=(x_test, x_test))

As this is a regression problem I choose to use mse-error as my loss function and Adam is the optimizer most commonly used

In conclusion, autoencoder is forced to form a representation at the intermediate hidden layer that has a smaller number of variables than the input. This forces the autoencoder to keep only the components that are useful for reconstructing the common features of the inputs and to reject any components that are not common features. As a result, an autoencoder will tend to learn a representation in the hidden layer that rejects noise from the input.


Ronak Chhatbar

AI Developer at

Want to explore all the ways you can start, run & grow your business?

Fill out the information below and we will get in touch with you shortly.