Blame view

LDA/vae.py 3.16 KB
7db73861f   Killian   add vae et mmf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  '''This script demonstrates how to build a variational autoencoder with Keras.
  Reference: "Auto-Encoding Variational Bayes" https://arxiv.org/abs/1312.6114
  '''
  
  import itertools
  import sys
  import json
  
  import numpy as np
  import matplotlib.pyplot as plt
  from scipy import sparse
  import scipy.io
  
  from keras.layers import Input, Dense, Lambda
  from keras.models import Model
  from keras import backend as K
  from keras import objectives
  from keras.datasets import mnist
  
  import pandas
  import shelve
  import pickle
  
  
  
  
  
  #batch_size = 16
  #original_dim = 784
  #latent_dim = 2
  #intermediate_dim = 128
  #epsilon_std = 0.01
  #nb_epoch = 40
  
  
  
  
  def train_vae(x_train,x_dev,x_test,y_train=None,y_dev=None,y_test=None,hidden_size=80,latent_dim=12,batch_size=8,nb_epochs=10,sgd="rmsprop",input_activation = "relu",output_activation = "sigmoid",epsilon_std=0.01):
  
  
  
      def sampling(args):
          z_mean, z_log_std = args
          epsilon = K.random_normal(shape=(batch_size, latent_dim),
                                    mean=0., std=epsilon_std)
          return z_mean + K.exp(z_log_std) * epsilon
  
      def vae_loss(x, x_decoded_mean):
          xent_loss = objectives.binary_crossentropy(x, x_decoded_mean)
          kl_loss = - 0.5 * K.mean(1 + z_log_std - K.square(z_mean) - K.exp(z_log_std), axis=-1)
          return xent_loss + kl_loss
  
      original_dim = x_train.shape[1]
  
  
      x = Input(batch_shape=(batch_size, original_dim))
      h = Dense(hidden_size, activation=input_activation)(x)
      z_mean = Dense(latent_dim)(h)
      z_log_std = Dense(latent_dim)(h)
  
  
      # note that "output_shape" isn't necessary with the TensorFlow backend
      # so you could write `Lambda(sampling)([z_mean, z_log_std])`
      z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_std])
  
      # we instantiate these layers separately so as to reuse them later
      decoder_h = Dense(hidden_size, activation=input_activation)
      decoder_mean = Dense(original_dim, activation=output_activation)
      h_decoded = decoder_h(z)
      x_decoded_mean = decoder_mean(h_decoded)
  
  
      vae = Model(x, x_decoded_mean)
      vae.compile(optimizer=sgd, loss=vae_loss)
  
      # train the VAE on MNIST digits
      if y_train is None or y_dev is None or y_test is None :
          y_train = x_train
          y_dev = x_dev
          y_test = x_test
  
      vae.fit(x_train, y_train,
              shuffle=True,
              nb_epoch=nb_epochs,
              batch_size=batch_size,
              validation_data=(x_dev, y_dev))
  
      # build a model to project inputs on the latent space
      encoder = Model(x, z_mean)
      pred_train = encoder.predict(x_train, batch_size=batch_size)
      pred_dev = encoder.predict(x_dev, batch_size=batch_size)
      pred_test = encoder.predict(x_test,batch_size=batch_size)
      return [ [ pred_train, pred_dev, pred_test ] ]
  # display a 2D plot of the digit classes in the latent space
      #x_test_encoded = encoder.predict(x_test, batch_size=batch_size)
      # build a digit generator that can sample from the learned distribution
      #decoder_input = Input(shape=(latent_dim,))
      #_h_decoded = decoder_h(decoder_input)
      #_x_decoded_mean = decoder_mean(_h_decoded)
      #generator = Model(decoder_input, _x_decoded_mean)
      #x_decoded = generator.predict(z_sample)