No account yet ?
The recurrent variational autoencoder (VRAE) is effective for large scale unsupervised learning on time series data by mapping the time series data to a latent vector representation.
The Recurrent Variational Autoencoder (VRAE) model is generative so that data can be generated from samples in latent space.
The Recurrent Variational Autoencoder (VRAE) model can use unlabeled data to facilitate supervised training of RNNs by initializing network weights and state.
Tested in Anaconda and Python 3.7
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.gridspec as gridspec import time from tensorflow.python.layers.base import Layer from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("mnist/") num_train=mnist.train.num_examples num_val=mnist.validation.num_examples num_test=mnist.test.num_examples transform_mean=np.ones(784)*0.5 transform_std=np.ones(784)*0.5 width=28 height=28 channel=1 Gaussian_scale=1.0 learning_label=5 tf.reset_default_graph() X=tf.placeholder(dtype=tf.float32,shape=[None,height*width*channel],name='input_image') y=tf.placeholder(dtype=tf.int32,shape=[None]) mask_psed_neg=tf.reshape(tf.cast(tf.equal(y,1),tf.float32),(-1,1)) mask_not_psed_neg=tf.reshape(tf.cast(tf.logical_not(tf.equal(y,1)),tf.float32),(-1,1)) y_onehot=tf.one_hot(y,3) class CNN_bn_Classifier(Layer): def __init__(self): self.conv1=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv1',_reuse=tf.AUTO_REUSE) self.conv2=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv2',_reuse=tf.AUTO_REUSE) self.conv3=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv3',_reuse=tf.AUTO_REUSE) self.batch_norm1=tf.layers.BatchNormalization(axis=3,name='bn1',_reuse=tf.AUTO_REUSE) self.batch_norm2=tf.layers.BatchNormalization(axis=3,name='bn2',_reuse=tf.AUTO_REUSE) self.batch_norm3=tf.layers.BatchNormalization(axis=3,name='bn3',_reuse=tf.AUTO_REUSE) self.max_pool=tf.layers.MaxPooling2D(pool_size=2,strides=2,_reuse=tf.AUTO_REUSE) self.fc=tf.layers.Dense(units=3,_reuse=tf.AUTO_REUSE) def __call__(self,inputs,is_training): out1=self.max_pool(self.batch_norm1(self.conv1(inputs),training=is_training)) out2=self.max_pool(self.batch_norm2(self.conv2(out1),training=is_training)) out3=self.max_pool(self.batch_norm3(self.conv3(out2),training=is_training)) score=self.fc(tf.layers.flatten(out3)) return score class CNN_Classifier(Layer): def __init__(self): self.conv1=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv1',_reuse=tf.AUTO_REUSE) self.conv2=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv2',_reuse=tf.AUTO_REUSE) self.conv3=tf.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same',activation=tf.nn.relu,name='conv3',_reuse=tf.AUTO_REUSE) self.max_pool=tf.layers.MaxPooling2D(pool_size=2,strides=2,_reuse=tf.AUTO_REUSE) self.avg_pool=tf.layers.AveragePooling2D(pool_size=7,strides=7,_reuse=tf.AUTO_REUSE) self.fc=tf.layers.Dense(units=3,_reuse=tf.AUTO_REUSE) def __call__(self,inputs): out1=self.max_pool(self.conv1(inputs)) out2=self.max_pool(self.conv2(out1)) out3=self.avg_pool(self.conv3(out2)) score=self.fc(tf.layers.flatten(out3)) return score class NN_Classifier(Layer): def __init__(self): self.linear1=tf.layers.Dense(units=512,name='linear1',activation=tf.nn.relu,_reuse=tf.AUTO_REUSE) self.linear2=tf.layers.Dense(units=256,name='linear2',activation=tf.nn.relu,_reuse=tf.AUTO_REUSE) self.linear3=tf.layers.Dense(units=256,name='linear3',activation=tf.nn.relu,_reuse=tf.AUTO_REUSE) self.linear4=tf.layers.Dense(units=3,name='linear4',_reuse=tf.AUTO_REUSE) def __call__(self,inputs): score=self.linear4(self.linear3(self.linear2(self.linear1(inputs)))) return score class VAE(Layer): def __init__(self): self.lstm_hidden_dim=256 self.latent_dim=512 self.n_time=15 self.encoder_lstm=tf.contrib.rnn.GRUCell(self.lstm_hidden_dim) self.decoder_lstm=tf.contrib.rnn.GRUCell(self.lstm_hidden_dim) self.encode_mean=tf.layers.Dense(units=self.latent_dim,name='encode_mean') # calculate mean of z self.encode_std=tf.layers.Dense(units=self.latent_dim,name='encode_std') # calculate std of z self.unit_gaussian=tf.distributions.Normal(loc=tf.zeros(self.latent_dim),scale=Gaussian_scale*tf.ones(self.latent_dim)) self.emit_net=tf.layers.Dense(units=height*width*channel,name='emit_net') def __call__(self,inputs): batch_size=tf.shape(inputs)[0] state_encode=self.encoder_lstm.zero_state(batch_size, tf.float32) # lstm tuple (c,h) state_decode=self.decoder_lstm.zero_state(batch_size, tf.float32) # lstm tuple (c,h) original_image=tf.layers.flatten(inputs) output_image=None latent_loss_his=[] classifier_loss_his=[] likelihood_his=[] predict_his=[] image_his=[] for t in range(self.n_time): if t==0: image=original_image else: # use output_image for fake images, use original image for real image image=mask_psed_neg*output_image+mask_not_psed_neg*original_image image_his.append(image) ''' Part I: Classifier ''' classifier_scope="CNN_classifier_"+str(t) # input_image=tf.reshape(image,(-1,height,width,channel)) input_image=tf.reshape(image,(-1,height*width*channel)) with tf.variable_scope(classifier_scope) as vs: classifier=NN_Classifier() score_likelihood=classifier(input_image) with tf.variable_scope(classifier_scope) as vs: classifier=NN_Classifier() score_classifier=classifier(tf.stop_gradient(input_image)) score_likelihood=tf.reshape(score_likelihood[:,0]-score_likelihood[:,1],(-1,1))*mask_psed_neg likelihood_his.append(score_likelihood) # only record score for fake images classifier_loss_his.append(tf.losses.softmax_cross_entropy(logits=score_classifier,onehot_labels=y_onehot)) predict_his.append(score_classifier) ''' Part II: Recurrent VAE ''' # add noise image+=tf.random_normal(shape=tf.shape(image),mean=0.0,stddev=1.0) with tf.variable_scope("pre_encoder") as vs: image=tf.layers.dense(image,units=512,activation=tf.nn.relu,name='dense_preencoder',reuse=tf.AUTO_REUSE) with tf.variable_scope("LSTM_encoder") as vs: encode_out,state_encode=self.encoder_lstm(image,state_encode) z_mean=self.encode_mean(encode_out) z_std=tf.exp(self.encode_std(encode_out)) distrib_encode=tf.distributions.Normal(loc=z_mean,scale=z_std) Z=distrib_encode.sample() latent_loss=tf.reduce_sum(mask_psed_neg*tf.distributions.kl_divergence(distrib_encode,self.unit_gaussian),axis=1) latent_loss_his.append(latent_loss) with tf.variable_scope("LSTM_decoder") as vs: decode_out,state_decode=self.decoder_lstm(Z,state_decode) output_image=self.emit_net(decode_out) tot_latent_loss=tf.reduce_mean(latent_loss_his) tot_classifier_loss=tf.reduce_mean(classifier_loss_his) tot_likelihood_loss=tf.reduce_sum(likelihood_his,axis=0) # accumulate score through time tot_likelihood_loss=tf.reduce_mean(-tot_likelihood_loss) tot_loss=tot_latent_loss+tot_classifier_loss+tot_likelihood_loss return image_his,tot_loss,tot_latent_loss,tot_classifier_loss,tot_likelihood_loss,predict_his vae=VAE() image_his,tot_loss,tot_latent_loss,tot_classifier_loss,tot_likelihood_loss,predict_his=vae(X) tot_classifier_loss=tot_classifier_loss tot_loss2=tot_latent_loss+tot_likelihood_loss classifier_variables=[] vae_variables=[] for v in tf.global_variables(): if v.name.find('CNN_classifier')!=-1: classifier_variables.append(v) else: vae_variables.append(v) global_step1 = tf.Variable(0, trainable=False) starter_learning_rate1 = 1e-3 learning_rate1 = tf.train.exponential_decay(starter_learning_rate1, global_step1,300, 0.98, staircase=True) optimizier1=tf.train.AdamOptimizer(learning_rate=learning_rate1) train_step1 = optimizier1.minimize(tot_classifier_loss,global_step=global_step1,var_list=classifier_variables) global_step2 = tf.Variable(0, trainable=False) starter_learning_rate2 = 4e-4 learning_rate2 = tf.train.exponential_decay(starter_learning_rate2, global_step2,100, 0.98, staircase=True) optimizier2=tf.train.RMSPropOptimizer(learning_rate=learning_rate2) train_step2 = optimizier2.minimize(tot_loss2,var_list=vae_variables) train_step2 = optimizier2.minimize(tot_loss2,global_step=global_step2,var_list=vae_variables) optimizier3=tf.train.AdamOptimizer(learning_rate=1e-3) train_step3 = optimizier3.minimize(tot_loss) extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) for v in tf.global_variables(): print(v) vv0=[v for v in tf.global_variables() if v.name=='emit_net/kernel:0'][0] with tf.Session() as sess: tf.global_variables_initializer().run() bias0=sess.run(vv0) print(bias0) print(np.mean(bias0),np.std(bias0)) # Generate process G_batch_size=tf.placeholder(shape=(),dtype=tf.int32,name='batch_size') G_state_decode=vae.decoder_lstm.zero_state(G_batch_size, tf.float32) G_unit_gaussian=tf.distributions.Normal(loc=tf.zeros((G_batch_size,vae.latent_dim)),scale=Gaussian_scale*tf.ones((G_batch_size,vae.latent_dim))) G_output_his=[] for t in range(vae.n_time): G_Z=G_unit_gaussian.sample() with tf.variable_scope("LSTM_decoder") as vs: G_decode_out,G_state_decode=vae.decoder_lstm(G_Z,G_state_decode) G_output_image=vae.emit_net(G_decode_out) G_output_his.append(G_output_image) G_output_result=G_output_his[-2] # last output images is meaningless(no gradient on this image) cpt = 0 def display(cpt): output_images=sess.run(G_output_result,feed_dict={G_batch_size:9}) # (9,784) output_images=output_images+0.5 plt.figure(figsize = (3,3)) gs1 = gridspec.GridSpec(3,3) gs1.update(wspace=0.025, hspace=0.05) for i in range(9): plt.subplot(gs1[i]) plt.imshow(output_images[i,:].reshape(28,28)) plt.axis('off') plt.savefig('figures/IVRAE/study-dim300and301_%s_MNIST.png' %(cpt)) plt.show() def make_batch(batch_size,fake_size,noise_size): X_true,labels=mnist.train.next_batch(batch_size) index=np.where(labels==learning_label)[0] X_true=X_true[index,:] X_true=X_true-0.5 # range=(-0.5,0.5) X_fake=np.random.uniform(low=-1.5,high=1.5,size=(fake_size,height*width*channel)) X_noise=np.random.uniform(low=-1.5,high=1.5,size=(noise_size,height*width*channel)) image=np.vstack((X_true,X_fake,X_noise)) label=np.concatenate((np.zeros(X_true.shape[0]),np.ones(fake_size),2*np.ones(noise_size))) return image,label,X_true.shape[0] batch_size=640 fake_size=128 noise_size=512 num_iteration=5000 print_every=100 test_every=100 classifier_train=3 vae_train=1 with tf.Session() as sess: tf.global_variables_initializer().run() for it in range(num_iteration): image,label,true_num=make_batch(batch_size,fake_size,noise_size) feed_dict={X:image,y:label} loss_num,l1,l2,l3=sess.run([tot_loss,tot_latent_loss,tot_classifier_loss,tot_likelihood_loss],feed_dict=feed_dict) for t in range(classifier_train): _=sess.run([train_step1],feed_dict={X:image,y:label}) for t in range(vae_train): _=sess.run([train_step2],feed_dict={X:image,y:label}) if it==0 or (it+1)%print_every==0 or it==num_iteration-1: print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'iteration %d/%d:' % (it+1,num_iteration),'current training loss = %f (=%f+%f+%f)' % (loss_num,l1,l2,l3)) if it==0 or (it+1)%test_every==0 or it==num_iteration-1: display(cpt) cpt += 100 temp=sess.run(image_his,feed_dict={X:image,y:label}) temp=temp[-1] plt.scatter(temp[:true_num,300],temp[:true_num,301],c='r') plt.scatter(temp[true_num:(true_num+fake_size),300],temp[true_num:(true_num+fake_size),301],c='b') plt.scatter(temp[-noise_size:,300],temp[-noise_size:,301],c='g') plt.savefig('figures/IVRAE/study-dim300and301_%d.png' % (it+1)) plt.show()
IVRAE - GitHub
2022-11-07 13:36:53 iteration 1/5000: current training loss = 12.217402 (=10.900205+1.247258+0.069940)
2022-11-07 13:37:33 iteration 100/5000: current training loss = 11.090100 (=3.009752+0.138252+7.942097)
2022-11-07 13:38:14 iteration 200/5000: current training loss = 6.147626 (=0.962875+0.161327+5.023424)
2022-11-07 13:38:53 iteration 300/5000: current training loss = 6.202072 (=0.356844+0.166221+5.679007)
2022-11-07 13:39:34 iteration 400/5000: current training loss = 6.848617 (=0.265549+0.148560+6.434509)
2022-11-07 13:40:13 iteration 500/5000: current training loss = 8.145394 (=0.243956+0.118974+7.782464)
2022-11-07 13:40:53 iteration 600/5000: current training loss = 7.714039 (=0.224149+0.125721+7.364169)
2022-11-07 13:41:33 iteration 700/5000: current training loss = 7.823611 (=0.219823+0.132989+7.470798)
2022-11-07 13:42:14 iteration 800/5000: current training loss = 9.130373 (=0.193878+0.131544+8.804950)
2022-11-07 13:42:56 iteration 900/5000: current training loss = 9.513477 (=0.216734+0.132586+9.164157)
2022-11-07 13:43:38 iteration 1000/5000: current training loss = 10.551974 (=0.221151+0.133116+10.197708)
2022-11-07 13:44:21 iteration 1100/5000: current training loss = 10.171009 (=0.216123+0.115534+9.839352)
2022-11-07 13:45:03 iteration 1200/5000: current training loss = 10.562627 (=0.210535+0.107438+10.244654)
2022-11-07 13:45:46 iteration 1300/5000: current training loss = 10.508433 (=0.213264+0.110864+10.184305)
2022-11-07 13:46:30 iteration 1400/5000: current training loss = 10.830463 (=0.221319+0.105077+10.504068)
2022-11-07 13:47:13 iteration 1500/5000: current training loss = 10.834600 (=0.225542+0.100553+10.508505)
2022-11-07 13:47:56 iteration 1600/5000: current training loss = 10.572217 (=0.224526+0.095680+10.252011)
2022-11-07 13:48:39 iteration 1700/5000: current training loss = 12.437384 (=0.225164+0.104539+12.107680)
2022-11-07 13:49:21 iteration 1800/5000: current training loss = 10.879166 (=0.239882+0.099790+10.539494)
2022-11-07 13:50:04 iteration 1900/5000: current training loss = 12.716721 (=0.237243+0.100092+12.379386)
2022-11-07 13:50:47 iteration 2000/5000: current training loss = 12.820364 (=0.251628+0.105845+12.462892)
2022-11-07 13:51:30 iteration 2100/5000: current training loss = 13.915642 (=0.251816+0.092556+13.571269)
2022-11-07 13:52:15 iteration 2200/5000: current training loss = 13.522700 (=0.246219+0.086848+13.189633)
2022-11-07 13:52:59 iteration 2300/5000: current training loss = 12.810856 (=0.257214+0.090234+12.463408)
2022-11-07 13:53:43 iteration 2400/5000: current training loss = 13.077998 (=0.256903+0.086471+12.734624)
2022-11-07 13:54:27 iteration 2500/5000: current training loss = 13.236374 (=0.272795+0.092336+12.871243)
2022-11-07 13:55:10 iteration 2600/5000: current training loss = 15.396122 (=0.307927+0.082161+15.006034)
2022-11-07 13:55:54 iteration 2700/5000: current training loss = 16.158409 (=0.298243+0.076686+15.783482)
2022-11-07 13:56:37 iteration 2800/5000: current training loss = 15.032340 (=0.331641+0.083572+14.617127)
2022-11-07 13:57:20 iteration 2900/5000: current training loss = 15.419291 (=0.344718+0.093102+14.981470)
2022-11-07 13:58:04 iteration 3000/5000: current training loss = 15.216044 (=0.317972+0.082339+14.815733)
2022-11-07 13:58:47 iteration 3100/5000: current training loss = 17.354694 (=0.334404+0.069980+16.950312)
2022-11-07 13:59:31 iteration 3200/5000: current training loss = 16.595022 (=0.347192+0.075040+16.172791)
2022-11-07 14:00:14 iteration 3300/5000: current training loss = 17.868841 (=0.385335+0.066525+17.416981)
2022-11-07 14:00:57 iteration 3400/5000: current training loss = 16.278910 (=0.349249+0.077515+15.852146)
2022-11-07 14:01:41 iteration 3500/5000: current training loss = 17.961239 (=0.339651+0.070310+17.551277)
2022-11-07 14:02:24 iteration 3600/5000: current training loss = 18.127251 (=0.358514+0.075333+17.693403)
2022-11-07 14:03:07 iteration 3700/5000: current training loss = 18.694281 (=0.359344+0.062553+18.272383)
2022-11-07 14:03:51 iteration 3800/5000: current training loss = 18.056028 (=0.369532+0.062959+17.623537)
2022-11-07 14:04:34 iteration 3900/5000: current training loss = 17.780973 (=0.366832+0.071570+17.342571)
2022-11-07 14:05:17 iteration 4000/5000: current training loss = 18.994682 (=0.398149+0.073082+18.523451)
2022-11-07 14:06:01 iteration 4100/5000: current training loss = 18.689419 (=0.409278+0.063852+18.216290)
2022-11-07 14:06:45 iteration 4200/5000: current training loss = 17.991161 (=0.408004+0.061734+17.521423)
2022-11-07 14:07:28 iteration 4300/5000: current training loss = 18.613052 (=0.418744+0.070269+18.124039)
2022-11-07 14:08:12 iteration 4400/5000: current training loss = 19.865395 (=0.413265+0.054005+19.398125)
2022-11-07 14:08:55 iteration 4500/5000: current training loss = 20.165215 (=0.430295+0.054386+19.680534)
2022-11-07 14:09:39 iteration 4600/5000: current training loss = 22.340302 (=0.399780+0.051696+21.888824)
2022-11-07 14:10:22 iteration 4700/5000: current training loss = 23.236195 (=0.410297+0.054149+22.771749)
2022-11-07 14:11:06 iteration 4800/5000: current training loss = 21.443058 (=0.439784+0.064549+20.938725)
2022-11-07 14:11:49 iteration 4900/5000: current training loss = 22.066431 (=0.414259+0.050627+21.601545)
2022-11-07 14:12:33 iteration 5000/5000: current training loss = 25.406422 (=0.436679+0.051470+24.918272)
Welcome, my name is Eric Soupet and I am the administrator of the site elodees.com. elodees.com is a state of the art of Artificial Intelligence and aims to be collaborative, you can now offer content such as articles, events, tutorials, ... so don't hesitate !
Platform images credit : Pixabay - Pixabay License | Pexels - Pexels License