# MNIST handwritten digit Autoencoding
# Inspired from some Keras code
# Jean-Pierre Briot
# 28/08/2018

# Patching the ssl certificate error...
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

import numpy as np
import random

import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib.path import Path
from matplotlib.patches import PathPatch

from keras.datasets import mnist
from keras.engine import Input, Model
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import np_utils
from keras import regularizers

# Dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()

fig, ax = plt.subplots()
im = ax.imshow(X_train[0])
plt.show()

# building the input vector from the 28x28 pixels
X_train = X_train.reshape(60000, 784)
X_train = X_train.astype('float32')

# normalizing the data to help with the training
X_train /= 255

# Setup the parameters
input_layer_size  = 28 * 28	# 784
hidden_layer_size =  200	# 200 hidden units
output_layer_size = input_layer_size

# Model of the Autoencoder
autoencoder = Sequential()

autoencoder.add(Dense(hidden_layer_size,
	input_dim = input_layer_size,
	activation = 'sigmoid',
	activity_regularizer = regularizers.l1(10e-5)))
autoencoder.add(Dense(input_layer_size,
	activation = 'sigmoid'))

# Organize decoder input

# Encoder_layer = autoencoder.layers[0]
Decoder_layer = autoencoder.layers[1]

Decoder_Input_layer = Input(shape = (hidden_layer_size, ))

decoder = Model(input = Decoder_Input_layer,
	output = Decoder_layer(Decoder_Input_layer))

autoencoder.compile(optimizer = 'adam',
	loss = 'binary_crossentropy',
	metrics = ['accuracy'])

autoencoder.fit(X_train,
	X_train,
	epochs = 5)

label1 = []
for i in range(hidden_layer_size):
	label1.append(random.uniform(-1, 1))

label2 = []
for i in range(hidden_layer_size):
	label2.append(random.uniform(0, 1))

digit1 = decoder.predict(np.array([label1]))[0]
digit1 = digit1.reshape(28, 28)

fig, ax = plt.subplots()
im = ax.imshow(digit1)
plt.show()

digit2 = decoder.predict(np.array([label2]))[0]
digit2 = digit2.reshape(28, 28)

fig, ax = plt.subplots()
im = ax.imshow(digit2)
plt.show()
