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)