ml-finance-python

python scripts for finance machine learning

git clone https://9o.is/git/ml-finance-python.git

autoencoder.py

(4017B)


      1 from __future__ import print_function, division
      2 from sklearn import datasets
      3 import math
      4 import matplotlib.pyplot as plt
      5 import numpy as np
      6 import progressbar
      7 
      8 from sklearn.datasets import fetch_mldata
      9 
     10 from mlfromscratch.deep_learning.optimizers import Adam
     11 from mlfromscratch.deep_learning.loss_functions import CrossEntropy, SquareLoss
     12 from mlfromscratch.deep_learning.layers import Dense, Dropout, Flatten, Activation, Reshape, BatchNormalization
     13 from mlfromscratch.deep_learning import NeuralNetwork
     14 
     15 
     16 class Autoencoder():
     17     """An Autoencoder with deep fully-connected neural nets.
     18 
     19     Training Data: MNIST Handwritten Digits (28x28 images)
     20     """
     21     def __init__(self):
     22         self.img_rows = 28
     23         self.img_cols = 28
     24         self.img_dim = self.img_rows * self.img_cols
     25         self.latent_dim = 128 # The dimension of the data embedding
     26 
     27         optimizer = Adam(learning_rate=0.0002, b1=0.5)
     28         loss_function = SquareLoss
     29 
     30         self.encoder = self.build_encoder(optimizer, loss_function)
     31         self.decoder = self.build_decoder(optimizer, loss_function)
     32 
     33         self.autoencoder = NeuralNetwork(optimizer=optimizer, loss=loss_function)
     34         self.autoencoder.layers.extend(self.encoder.layers)
     35         self.autoencoder.layers.extend(self.decoder.layers)
     36 
     37         print ()
     38         self.autoencoder.summary(name="Variational Autoencoder")
     39 
     40     def build_encoder(self, optimizer, loss_function):
     41 
     42         encoder = NeuralNetwork(optimizer=optimizer, loss=loss_function)
     43         encoder.add(Dense(512, input_shape=(self.img_dim,)))
     44         encoder.add(Activation('leaky_relu'))
     45         encoder.add(BatchNormalization(momentum=0.8))
     46         encoder.add(Dense(256))
     47         encoder.add(Activation('leaky_relu'))
     48         encoder.add(BatchNormalization(momentum=0.8))
     49         encoder.add(Dense(self.latent_dim))
     50 
     51         return encoder
     52 
     53     def build_decoder(self, optimizer, loss_function):
     54 
     55         decoder = NeuralNetwork(optimizer=optimizer, loss=loss_function)
     56         decoder.add(Dense(256, input_shape=(self.latent_dim,)))
     57         decoder.add(Activation('leaky_relu'))
     58         decoder.add(BatchNormalization(momentum=0.8))
     59         decoder.add(Dense(512))
     60         decoder.add(Activation('leaky_relu'))
     61         decoder.add(BatchNormalization(momentum=0.8))
     62         decoder.add(Dense(self.img_dim))
     63         decoder.add(Activation('tanh'))
     64 
     65         return decoder
     66 
     67     def train(self, n_epochs, batch_size=128, save_interval=50):
     68 
     69         mnist = fetch_mldata('MNIST original')
     70 
     71         X = mnist.data
     72         y = mnist.target
     73 
     74         # Rescale [-1, 1]
     75         X = (X.astype(np.float32) - 127.5) / 127.5
     76 
     77         for epoch in range(n_epochs):
     78 
     79             # Select a random half batch of images
     80             idx = np.random.randint(0, X.shape[0], batch_size)
     81             imgs = X[idx]
     82 
     83             # Train the Autoencoder
     84             loss, _ = self.autoencoder.train_on_batch(imgs, imgs)
     85 
     86             # Display the progress
     87             print ("%d [D loss: %f]" % (epoch, loss))
     88 
     89             # If at save interval => save generated image samples
     90             if epoch % save_interval == 0:
     91                 self.save_imgs(epoch, X)
     92 
     93     def save_imgs(self, epoch, X):
     94         r, c = 5, 5 # Grid size
     95         # Select a random half batch of images
     96         idx = np.random.randint(0, X.shape[0], r*c)
     97         imgs = X[idx]
     98         # Generate images and reshape to image shape
     99         gen_imgs = self.autoencoder.predict(imgs).reshape((-1, self.img_rows, self.img_cols))
    100 
    101         # Rescale images 0 - 1
    102         gen_imgs = 0.5 * gen_imgs + 0.5
    103 
    104         fig, axs = plt.subplots(r, c)
    105         plt.suptitle("Autoencoder")
    106         cnt = 0
    107         for i in range(r):
    108             for j in range(c):
    109                 axs[i,j].imshow(gen_imgs[cnt,:,:], cmap='gray')
    110                 axs[i,j].axis('off')
    111                 cnt += 1
    112         fig.savefig("ae_%d.png" % epoch)
    113         plt.close()
    114 
    115 
    116 if __name__ == '__main__':
    117     ae = Autoencoder()
    118     ae.train(n_epochs=200000, batch_size=64, save_interval=400)