diff --git a/BIRNNAE.py b/BIRNNAE.py deleted file mode 100755 index c5ec707fa7033345a627ef16f8e715ebcfd5af7c..0000000000000000000000000000000000000000 --- a/BIRNNAE.py +++ /dev/null @@ -1,38 +0,0 @@ -import tensorflow as tf - - -class RNNAE(tf.keras.Model): - def __init__(self, filters, outputDim, dropout_rate = 0.0, hidden_activation='relu', output_activation='softmax', - name='convNetwork2', - **kwargs): - # chiamata al costruttore della classe padre, Model - super(RNNAE, self).__init__(name=name, **kwargs) - self.encoderR = tf.keras.layers.LSTM(filters, go_backwards=True) - self.encoder = tf.keras.layers.LSTM(filters) - - self.decoder = tf.keras.layers.LSTM(filters, return_sequences=True) - self.decoder2 = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=outputDim, activation=None)) - - self.decoderR = tf.keras.layers.LSTM(filters, return_sequences=True) - self.decoder2R = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=outputDim, activation=None)) - - - def call(self, inputs, training=False): - t = inputs.get_shape() - enc = self.encoder(inputs) - emb = enc - seq_emb = tf.keras.layers.RepeatVector(t[1])(emb) - dec = self.decoder(seq_emb) - dec = self.decoder2(dec) - - - encR = self.encoderR(inputs) - embR = encR - seq_embR = tf.keras.layers.RepeatVector(t[1])(embR) - decR = self.decoderR(seq_embR) - decR = self.decoder2R(decR) - decR = tf.reverse(decR, axis=[1]) - - return dec, decR, tf.concat((emb,embR),axis=1) - - #(dec+decR)/2, tf.concat((emb,embR),axis=1), tf.concat((emb,embR),axis=1), tf.concat((emb,embR),axis=1) diff --git a/main.py b/main.py deleted file mode 100644 index 0cfe2257511501c5a5f007a09e72dbef2a11e871..0000000000000000000000000000000000000000 --- a/main.py +++ /dev/null @@ -1,238 +0,0 @@ -import numpy as np -import tensorflow as tf -import os -import sys -from sklearn.metrics import f1_score, r2_score -from sklearn.utils import shuffle -from sklearn.ensemble import RandomForestRegressor -from sklearn.linear_model import LinearRegression -from sklearn.model_selection import KFold -import time -from sklearn.manifold import TSNE -import matplotlib.pyplot as pyplot -from sklearn.cluster import KMeans -from sklearn.metrics import normalized_mutual_info_score -from active_semi_clustering.semi_supervised.pairwise_constraints import MPCKMeans, PCKMeans, COPKMeans - - -from model import RNNAE - -def generateConstraints(idxLabelledData, labels): - ml = [] - cl = [] - for i in range(len(idxLabelledData)): - for j in range(i+1,len(idxLabelledData)): - if labels[i] == labels[j]: - ml.append([i,j]) - else: - cl.append([i,j]) - return ml, cl - - -def getBatch(X, i, batch_size): - start_id = i*batch_size - t = (i+1) * batch_size - end_id = min( (i+1) * batch_size, X.shape[0]) - batch_x = X[start_id:end_id] - return batch_x - -def buildPair(x_train, labels): - f_data = [] - s_data = [] - y_val = [] - n_examples = labels.shape[0] - for i in range(n_examples): - for j in range(i+1, n_examples): - if labels[i] == labels[j]: - y_val.append(0) - else: - y_val.append(1) - f_data.append( x_train[i]) - s_data.append( x_train[j]) - return np.stack(f_data, axis=0), np.stack(s_data, axis=0), np.array(y_val) - - -def trainStepL(model, f_data, s_data, y_val, loss_object, optimizer, BATCH_SIZE, e): - loss_iteration = 0 - tot_loss = 0.0 - margin = 1.0 - - f_data, s_data, y_val = shuffle(f_data, s_data, y_val) - iterations = f_data.shape[0] / BATCH_SIZE - if f_data.shape[0] % BATCH_SIZE != 0: - iterations += 1 - - for ibatch in range(int(iterations)): - batch_f = getBatch(f_data, ibatch, BATCH_SIZE) - batch_s = getBatch(s_data, ibatch, BATCH_SIZE) - batch_y = getBatch(y_val, ibatch, BATCH_SIZE) - with tf.GradientTape() as tape: - d_w = model.siameseDistance([batch_f, batch_s], training=True) - equal_loss = (.5* (1-batch_y) * d_w) - neg_loss = (.5* batch_y * tf.math.maximum(0 , margin - d_w) ) - - loss = equal_loss + neg_loss - loss = tf.reduce_mean(loss) - _, reco_f, reco_fR, _ = model(batch_f, training=True) - _, reco_s, reco_sR, _ = model(batch_s, training=True) - - loss+= loss_object(batch_f, reco_f) - loss+= loss_object(batch_f, reco_fR) - - loss+= loss_object(batch_s, reco_s) - loss+= loss_object(batch_f, reco_sR) - grads = tape.gradient(loss, model.trainable_variables) - grads = [grad if grad is not None else tf.zeros_like(var) for var, grad in zip(model.trainable_variables, grads)] - optimizer.apply_gradients(zip(grads, model.trainable_variables)) - tot_loss+=loss - - return (tot_loss / iterations) - -def trainStepStrech(model, x_train, centers, loss_object, optimizer, BATCH_SIZE, e): - loss_iteration = 0 - tot_loss = 0.0 - cosineSim = tf.keras.losses.CosineSimilarity(reduction=tf.keras.losses.Reduction.NONE) - iterations = x_train.shape[0] / BATCH_SIZE - if x_train.shape[0] % BATCH_SIZE != 0: - iterations += 1 - - centers = centers.astype("float32") - for ibatch in range(int(iterations)): - batch_x = getBatch(x_train, ibatch, BATCH_SIZE) - batch_c = getBatch(centers, ibatch, BATCH_SIZE) - with tf.GradientTape() as tape: - emb, reco, recoR, classif = model(batch_x, training=True) - loss_rec = loss_object(batch_x, reco) - loss_rec+= loss_object(batch_x, recoR) - loss_rec+= tf.reduce_mean(tf.reduce_sum( tf.square(batch_c - emb), axis=1)) - grads = tape.gradient(loss_rec, model.trainable_variables) - grads = [grad if grad is not None else tf.zeros_like(var) for var, grad in zip(model.trainable_variables, grads)] - optimizer.apply_gradients(zip(grads, model.trainable_variables)) - tot_loss+=loss_rec - return (tot_loss / iterations) - - - -def trainStep(model, x_train, loss_object, optimizer, BATCH_SIZE, e): - loss_iteration = 0 - tot_loss = 0.0 - iterations = x_train.shape[0] / BATCH_SIZE - if x_train.shape[0] % BATCH_SIZE != 0: - iterations += 1 - for ibatch in range(int(iterations)): - batch_x = getBatch(x_train, ibatch, BATCH_SIZE) - with tf.GradientTape() as tape: - emb, reco, recoR, classif = model(batch_x, training=True) - loss_rec = loss_object(batch_x, reco) - loss_rec += loss_object(batch_x, recoR) - grads = tape.gradient(loss_rec, model.trainable_variables) - grads = [grad if grad is not None else tf.zeros_like(var) for var, grad in zip(model.trainable_variables, grads)] - optimizer.apply_gradients(zip(grads, model.trainable_variables)) - tot_loss+=loss_rec - return (tot_loss / iterations) - - -def trainRNNAE(model, nClasses, data, f_data, s_data, y_val, loss_huber, optimizer, optimizer2, BATCH_SIZE, n_epochs): - #th = 40 - n_epochs_warmUp = 40 - centers = None - print("PRETRAINING STAGE : AE + CONTRASTIVE LOSS") - for e in range(n_epochs_warmUp): - f_data, s_data, y_val, = shuffle(f_data, s_data, y_val) - data = shuffle(data) - trainLoss = trainStep(model, data, loss_huber, optimizer, BATCH_SIZE, e) - trainLoss += trainStepL(model, f_data, s_data, y_val, loss_huber, optimizer2, BATCH_SIZE, e) - print("epoch %d with loss %f" % (e, trainLoss)) - - - print("COMPUTE INTERMEDIATE CLUSTERING ASSIGNMENT") - emb, _, _, _ = model(data) - km = KMeans(n_clusters=nClasses) - km.fit(emb) - centers = [] - for val in km.labels_: - centers.append( km.cluster_centers_[val]) - centers = np.array(centers) - - - print("REFINEMENT STEP alternating AE + MANIFOLD STRETCH TOWARDS CENTROIDS and AE + CONTRASTIVE LOSS") - for e in range(n_epochs - n_epochs_warmUp): - #labelledData, labelsSmall = shuffle(labelledData, labelsSmall) - data, centers = shuffle(data, centers) - trainLoss = trainStepStrech(model, data, centers, loss_huber, optimizer, BATCH_SIZE, e) - trainLoss += trainStepL(model, f_data, s_data, y_val, loss_huber, optimizer2, BATCH_SIZE, e) - print("epoch %d with loss %f" % (e, trainLoss)) - - return model - -def plot2DFeatures(data, labels): - X_embedded = TSNE(n_components=2).fit_transform( data ) - nclasses = len(np.unique(labels)) - for i in range(nclasses): - idx = np.where(labels == i) - pyplot.scatter(X_embedded[idx[0],0], X_embedded[idx[0],1]) - - pyplot.draw() - pyplot.pause(10) - pyplot.clf() - - -def getExtractLabelSet(data, labels, nSamples): - labelledData = [] - labelsSmall = [] - for val in np.unique(labels): - idx = np.where(labels == val) - idx = shuffle( idx[0] )[0:nSamples] - labelledData.append( data[idx] ) - for j in range(nSamples): - labelsSmall.append(val) - labelledData = np.concatenate(labelledData, axis=0) - return labelledData, np.array(labelsSmall) - - -def main(argv): - dataDir = argv[1] - nSamples = argv[2] - runId = argv[3] - - data = np.load(dataDir+"/data.npy") - labels = np.load(dataDir+"/class.npy") - - idxLabelledData = np.load(dataDir+"/"+nSamples+"_"+runId+".npy") - - labelledData = data[idxLabelledData] - labelsSmall = labels[idxLabelledData] - - f_data, s_data, y_val = buildPair(labelledData, labelsSmall) - - print("labelledData.shape ",labelledData.shape) - print("labelsSmall.shape ",labelsSmall.shape) - origData = np.array(data) - - nClasses = len(np.unique(labels)) - - RNNAE_model = RNNAE(64, data.shape[-1], nClasses, dropout_rate=0.2) - """ defining loss function and the optimizer to use in the training phase """ - loss_huber = tf.keras.losses.Huber() - loss_object2 = tf.keras.losses.Huber(reduction=tf.keras.losses.Reduction.NONE)#MeanAbsoluteError()# - optimizer = tf.keras.optimizers.Adam(learning_rate=0.0005) - optimizer2 = tf.keras.optimizers.Adam(learning_rate=0.0005) - - - - BATCH_SIZE = 32 - n_epochs = 100 - - RNNAE_model = trainRNNAE(RNNAE_model, nClasses, data, f_data, s_data, y_val, loss_huber, optimizer, optimizer2, BATCH_SIZE, n_epochs) - emb, _, _, _ = RNNAE_model(origData) - - emb = emb.numpy() - km = KMeans(n_clusters=nClasses) - km.fit(emb) - nmi = normalized_mutual_info_score(labels, km.labels_) - print("nmi %f" % nmi) - -if __name__ == "__main__": - main(sys.argv) - -#plot2DFeatures(emb, labels) diff --git a/main_varyingLength.py b/main_varyingLength.py index 145f72591df63bc3a05efbc3327e1b5e557d1445..5923b2f99640eb36bd843a4255f422afcad6b7d1 100644 --- a/main_varyingLength.py +++ b/main_varyingLength.py @@ -14,9 +14,12 @@ from sklearn.cluster import KMeans from sklearn.metrics import normalized_mutual_info_score from active_semi_clustering.semi_supervised.pairwise_constraints import MPCKMeans, PCKMeans, COPKMeans - from model import RNNAE +#gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.45) +#sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options)) + + def generateConstraints(idxLabelledData, labels): ml = [] cl = [] @@ -80,8 +83,8 @@ def trainStepL(model, f_data, f_data_mask, s_data, s_data_mask, y_val, loss_obje loss = equal_loss + neg_loss loss = tf.reduce_mean(loss) - _, reco_f, reco_fR, _ = model(batch_f, training=True) - _, reco_s, reco_sR, _ = model(batch_s, training=True) + _, reco_f, reco_fR = model(batch_f, training=True) + _, reco_s, reco_sR = model(batch_s, training=True) loss+= loss_object(batch_f, reco_f*batch_f_mask) loss+= loss_object(batch_f, reco_fR*batch_f_mask) @@ -98,7 +101,6 @@ def trainStepL(model, f_data, f_data_mask, s_data, s_data_mask, y_val, loss_obje def trainStepStrech(model, x_train, valid_mask, centers, loss_object, optimizer, BATCH_SIZE, e): loss_iteration = 0 tot_loss = 0.0 - cosineSim = tf.keras.losses.CosineSimilarity(reduction=tf.keras.losses.Reduction.NONE) iterations = x_train.shape[0] / BATCH_SIZE if x_train.shape[0] % BATCH_SIZE != 0: iterations += 1 @@ -109,7 +111,7 @@ def trainStepStrech(model, x_train, valid_mask, centers, loss_object, optimizer, batch_mask = getBatch(valid_mask, ibatch, BATCH_SIZE) batch_c = getBatch(centers, ibatch, BATCH_SIZE) with tf.GradientTape() as tape: - emb, reco, recoR, classif = model(batch_x, training=True) + emb, reco, recoR = model(batch_x, training=True) loss_rec = loss_object(batch_x, reco*batch_mask) loss_rec+= loss_object(batch_x, recoR*batch_mask) loss_rec+= tf.reduce_mean(tf.reduce_sum( tf.square(batch_c - emb), axis=1)) @@ -131,7 +133,7 @@ def trainStep(model, x_train, valid_mask, loss_object, optimizer, BATCH_SIZE, e) batch_x = getBatch(x_train, ibatch, BATCH_SIZE) batch_mask = getBatch(valid_mask, ibatch, BATCH_SIZE) with tf.GradientTape() as tape: - emb, reco, recoR, classif = model(batch_x, training=True) + emb, reco, recoR = model(batch_x, training=True) loss_rec = loss_object(batch_x, reco*batch_mask) loss_rec += loss_object(batch_x, recoR*batch_mask) grads = tape.gradient(loss_rec, model.trainable_variables) @@ -142,9 +144,9 @@ def trainStep(model, x_train, valid_mask, loss_object, optimizer, BATCH_SIZE, e) def trainRNNAE(model, nClasses, data, valid_mask, f_data, f_data_mask, s_data, s_data_mask, y_val, loss_huber, optimizer, optimizer2, BATCH_SIZE, n_epochs): - #th = 40 n_epochs_warmUp = 40 centers = None + print("PRETRAINING STAGE : AE + CONTRASTIVE LOSS") for e in range(n_epochs_warmUp): f_data, f_data_mask, s_data, s_data_mask, y_val = shuffle(f_data, f_data_mask, s_data, s_data_mask, y_val) @@ -155,7 +157,7 @@ def trainRNNAE(model, nClasses, data, valid_mask, f_data, f_data_mask, s_data, s print("COMPUTE INTERMEDIATE CLUSTERING ASSIGNMENT") - emb, _, _, _ = model(data) + emb, _, _ = model(data) km = KMeans(n_clusters=nClasses) km.fit(emb) centers = [] @@ -166,38 +168,15 @@ def trainRNNAE(model, nClasses, data, valid_mask, f_data, f_data_mask, s_data, s print("REFINEMENT STEP alternating AE + MANIFOLD STRETCH TOWARDS CENTROIDS and AE + CONTRASTIVE LOSS") for e in range(n_epochs - n_epochs_warmUp): - #labelledData, labelsSmall = shuffle(labelledData, labelsSmall) data, centers, valid_mask = shuffle(data, centers, valid_mask) + #STRECHING THE EMBEDDING TOWARDS CENTROIDS trainLoss = trainStepStrech(model, data, valid_mask, centers, loss_huber, optimizer, BATCH_SIZE, e) + #FORCING EMBEDDING TO MATCH CONSTRAINTS trainLoss += trainStepL(model, f_data, f_data_mask, s_data, s_data_mask, y_val, loss_huber, optimizer2, BATCH_SIZE, e) print("epoch %d with loss %f" % (e, trainLoss)) return model -def plot2DFeatures(data, labels): - X_embedded = TSNE(n_components=2).fit_transform( data ) - nclasses = len(np.unique(labels)) - for i in range(nclasses): - idx = np.where(labels == i) - pyplot.scatter(X_embedded[idx[0],0], X_embedded[idx[0],1]) - - pyplot.draw() - pyplot.pause(10) - pyplot.clf() - - -def getExtractLabelSet(data, labels, nSamples): - labelledData = [] - labelsSmall = [] - for val in np.unique(labels): - idx = np.where(labels == val) - idx = shuffle( idx[0] )[0:nSamples] - labelledData.append( data[idx] ) - for j in range(nSamples): - labelsSmall.append(val) - labelledData = np.concatenate(labelledData, axis=0) - return labelledData, np.array(labelsSmall) - def createMaskTensor(data, valid_lengths): mask = np.zeros(data.shape) nrow, nt, ndim = mask.shape @@ -207,27 +186,31 @@ def createMaskTensor(data, valid_lengths): return mask def main(argv): + #Directory in which data are stored dataDir = argv[1] + #number of labelled samples to access data information nSamples = argv[2] + #run identifier to add to the output file name runId = argv[3] + newDir = dataDir+"/OUR_VL" + if not os.path.exists(newDir): + os.makedirs(newDir) + data = np.load(dataDir+"/data.npy") labels = np.load(dataDir+"/class.npy") valid_lengths = np.load(dataDir+"/seqLength.npy") valid_mask = createMaskTensor(data, valid_lengths) - - idxLabelledData = np.load(dataDir+"/"+nSamples+"_"+runId+".npy") labelledData = data[idxLabelledData] labelsSmall = labels[idxLabelledData] labelledValidMask = valid_mask[idxLabelledData] + #FROM THE LABELLED EXAMPLES BUILD THE WHOLE SET OF MUST AND CANNOT LINK CONSTRAINTS f_data, f_data_mask, s_data, s_data_mask, y_val = buildPair(labelledData, labelsSmall, labelledValidMask) - print("labelledData.shape ",labelledData.shape) - print("labelsSmall.shape ",labelsSmall.shape) origData = np.array(data) nClasses = len(np.unique(labels)) @@ -235,25 +218,25 @@ def main(argv): RNNAE_model = RNNAE(64, data.shape[-1], nClasses, dropout_rate=0.2) """ defining loss function and the optimizer to use in the training phase """ loss_huber = tf.keras.losses.Huber() - loss_object2 = tf.keras.losses.Huber(reduction=tf.keras.losses.Reduction.NONE)#MeanAbsoluteError()# optimizer = tf.keras.optimizers.Adam(learning_rate=0.0005) optimizer2 = tf.keras.optimizers.Adam(learning_rate=0.0005) - - BATCH_SIZE = 32 + #Total number of epochs n_epochs = 100 RNNAE_model = trainRNNAE(RNNAE_model, nClasses, data, valid_mask, f_data, f_data_mask, s_data, s_data_mask, y_val, loss_huber, optimizer, optimizer2, BATCH_SIZE, n_epochs) - emb, _, _, _ = RNNAE_model(origData) + emb, _, _ = RNNAE_model(origData) emb = emb.numpy() km = KMeans(n_clusters=nClasses) km.fit(emb) nmi = normalized_mutual_info_score(labels, km.labels_) print("nmi %f" % nmi) + #Save the clustering results obtained via the K-Means algorithm applied on the embedding generated by our approach + np.save(newDir+"/res_"+nSamples+"_"+runId+".npy", km.labels_) + #Save the embdding generated by our framework + np.save(newDir+"/emb_"+nSamples+"_"+runId+".npy", emb) if __name__ == "__main__": main(sys.argv) - -#plot2DFeatures(emb, labels) diff --git a/model.py b/model.py index 06e7b84013e2249e7bda8df45696c8120cd5623e..914535aa34680ca7c7afafa89e8175d1a9cdf34e 100644 --- a/model.py +++ b/model.py @@ -1,85 +1,20 @@ import tensorflow as tf -class AttentionLayer(tf.keras.layers.Layer): - def __init__(self, ch_output): - super(AttentionLayer, self).__init__() - self.ch_output = ch_output - self.activation = tf.math.tanh #tf.nn.leaky_relu - self.output_activation = tf.keras.activations.softmax - - def build(self, input_shape): - ''' - print(input_shape) - if len(input_shape) > 1: - input_dim = input_shape[1] - else: - input_dim = input_shape - print(input_dim) - exit() - ''' - input_dim = input_shape[-1] - self.A = self.add_weight(name="a_weight_matrix", shape=(self.ch_output, 1)) - self.W = self.add_weight(name="W_target_nodes_weights", shape=[self.ch_output, self.ch_output]) - self.tgt_node_b = self.add_weight(name='bias_target', shape=(self.ch_output,), initializer='zeros') - self.neigh_b = self.add_weight(name='bias_neigh', shape=(self.ch_output,), initializer='zeros') - - def call(self, inputs, **kwargs): - #hi = inputs[0] - # target_nodes shape: batch_size x features_size F - # hj shape: batch_size x max(|N(x)|) x features_size F - #mask = tf.dtypes.cast(kwargs.get('mask'), tf.float32) - # mask shape: batch_size x max(|N(x)|) - - #whi = tf.nn.bias_add(tf.tensordot(hi, self.W, axes=1), self.tgt_node_b) - # whi shape: batch_size x features_output F' - #print(inputs.get_shape()) - #print(self.W.get_shape()) - whj = tf.nn.bias_add(tf.tensordot(inputs, self.W, axes=1), self.neigh_b) - #print("whj ",whj.get_shape()) - # whj shape: batch_size x max(|N(x)|) x features_output F' - multiply_dim = len(whj[0]) - #whi = tf.tile(tf.expand_dims(whi, 1), multiples=(1, multiply_dim, 1)) - # whi shape for concat: batch_size x features_output F' - #concat = whj - #concat = tf.concat([whi, whj], axis=2) - # concat shape: batch_size x max(|N(x)|) x 2F' - scores = self.activation(tf.tensordot(whj, self.A, axes=1)) - scores = tf.squeeze(scores, axis=-1) - # scores shape: batch_size x max(|N(x)|) - #masked_scores = scores * mask - alphas = self.output_activation(scores) - hj = inputs * tf.expand_dims(alphas, -1) - # hj shape: batch_size x max(|N(x)|) x features_output F' - output = tf.reduce_sum(hj, axis=1) - # output shape: (batch_size x features_output F') - return output, alphas - - - - class RNNAE(tf.keras.Model): def __init__(self, filters, outputDim, n_cluster, dropout_rate = 0.0, hidden_activation='relu', output_activation='softmax', - name='convNetwork2', + name='RNNAE', **kwargs): # chiamata al costruttore della classe padre, Model super(RNNAE, self).__init__(name=name, **kwargs) - self.attention = AttentionLayer(filters) - self.attentionR = AttentionLayer(filters) - self.gate = tf.keras.layers.Dense(filters, activation='sigmoid') - self.gateR = tf.keras.layers.Dense(filters, activation='sigmoid') - self.encoder = tf.keras.layers.GRU(filters, return_sequences=True) self.encoderR = tf.keras.layers.GRU(filters, go_backwards=True, return_sequences=True) - self.classif = tf.keras.layers.Dense(n_cluster, activation='softmax') + self.decoder = tf.keras.layers.GRU(filters, return_sequences=True) self.decoder2 = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=outputDim, activation=None)) self.decoderR = tf.keras.layers.GRU(filters, return_sequences=True) self.decoder2R = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=outputDim, activation=None)) - #self.TDclassif = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=n_cluster, activation='softmax')) - - def siameseDistance(self, inputs, training=False): first_elements = inputs[0] second_elements = inputs[1] @@ -94,10 +29,7 @@ class RNNAE(tf.keras.Model): seqEmbR = self.encoderR(inputs) emb = tf.unstack(seqEmb,axis=1)[-1] embR = tf.unstack(seqEmbR,axis=1)[-1] - #emb = self.gate(emb) * emb - #embR = self.gate(embR) * embR return emb+embR - #return tf.concat([emb,embR],axis=1)#emb+embR def decF(self, seq_emb, emb, training=False): dec = self.decoder(seq_emb) @@ -105,19 +37,15 @@ class RNNAE(tf.keras.Model): dec = self.decoder2(dec) decR = self.decoder2R(decR) - - pred = self.classif(emb) - #print(decR.get_shape()) - decR = tf.reverse(decR, axis=[1]) - #exit() - return dec, decR, pred + + return dec, decR def call(self, inputs, training=False): t = inputs.get_shape() emb = self.encF(inputs, training) seq_emb = tf.keras.layers.RepeatVector(t[1])(emb) - dec, decR, pred = self.decF(seq_emb, emb, training) - return emb, dec, decR, pred + dec, decR = self.decF(seq_emb, emb, training) + return emb, dec, decR #(dec+decR)/2, tf.concat((emb,embR),axis=1), tf.concat((emb,embR),axis=1), tf.concat((emb,embR),axis=1)