From d000b0c1c651c82e85a406fab38c9b345bce8fd5 Mon Sep 17 00:00:00 2001 From: TechBotBuilder Date: Sun, 3 Apr 2016 23:51:20 -0400 Subject: [PATCH 1/2] Added files via upload --- rnn.py | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/rnn.py b/rnn.py index e5d55bc..3fba3a1 100644 --- a/rnn.py +++ b/rnn.py @@ -10,7 +10,8 @@ import time import os import datetime -import cPickle as pickle +#import cPickle as pickle +import pickle logger = logging.getLogger(__name__) @@ -134,7 +135,12 @@ def step(x_t, h_tm1): def mse(self, y): # error between output and target - return T.mean((self.y_pred - y) ** 2) + ##EDITED BY MAX + #dontcare = T.isnan(y) + #y = T.set_subtensor(y[dontcare], self.y_pred[dontcare]) + #return T.mean((self.y_pred - y) ** 2) + care = T.nonzero(T.eq(T.isnan(y),0)) + return T.mean((self.y_pred[care] - y[care]) ** 2).sum() def nll_binary(self, y): # negative log likelihood based on binary cross entropy error @@ -268,6 +274,19 @@ def shared_dataset(self, data_xy): else: return shared_x, shared_y + def _get_params(self):#added by max. was called but never defined. + """ Return parameters set in constructor. """ + return [self.n_in, self.n_hidden, self.n_out, self.learning_rate, + self.learning_rate_decay, self.n_epochs, self.L1_reg, self.L2_reg, + self.activation, self.output_type, self.initial_momentum, + self.final_momentum, self.momentum_switchover, self.use_symbolic_softmax] + + def set_params(self, newparams):#added by max. was called but never defined. + self.n_in, self.n_hidden, self.n_out, self.learning_rate = newparams[:4] + self.learning_rate_decay, self.n_epochs, self.L1_reg, self.L2_reg = newparams[4:8] + self.activation, self.output_type, self.initial_momentum = newparams[8:11] + self.final_momentum, self.momentum_switchover, self.use_symbolic_softmax = newparams[11:] + def __getstate__(self): """ Return state sequence.""" params = self._get_params() # parameters set in constructor @@ -371,8 +390,7 @@ def fit(self, X_train, Y_train, X_test=None, Y_test=None, outputs=self.rnn.loss(self.y), givens={ self.x: train_set_x[index], - self.y: train_set_y[index]}, - mode=mode) + self.y: train_set_y[index]}, mode=mode) if self.interactive: compute_test_error = theano.function(inputs=[index, ], @@ -389,12 +407,12 @@ def fit(self, X_train, Y_train, X_test=None, Y_test=None, gparam = T.grad(cost, param) gparams.append(gparam) - updates = {} + updates = [] for param, gparam in zip(self.rnn.params, gparams): weight_update = self.rnn.updates[param] upd = mom * weight_update - l_r * gparam - updates[weight_update] = upd - updates[param] = param + upd + updates.append((weight_update, upd)) + updates.append((param, param + upd)) # compiling a Theano function `train_model` that returns the # cost, but in the same time updates the parameter of the @@ -415,7 +433,7 @@ def fit(self, X_train, Y_train, X_test=None, Y_test=None, while (epoch < self.n_epochs): epoch = epoch + 1 - for idx in xrange(n_train): + for idx in range(n_train): effective_momentum = self.final_momentum \ if epoch > self.momentum_switchover \ else self.initial_momentum @@ -429,12 +447,12 @@ def fit(self, X_train, Y_train, X_test=None, Y_test=None, if iter % validation_frequency == 0: # compute loss on training set train_losses = [compute_train_error(i) - for i in xrange(n_train)] + for i in range(n_train)] this_train_loss = np.mean(train_losses) if self.interactive: test_losses = [compute_test_error(i) - for i in xrange(n_test)] + for i in range(n_test)] this_test_loss = np.mean(test_losses) logger.info('epoch %i, seq %i/%i, tr loss %f ' @@ -522,7 +540,7 @@ def test_binary(multiple_out=False, n_epochs=250): model.fit(seq, targets, validation_frequency=1000) - seqs = xrange(10) + seqs = range(10) plt.close('all') for seq_num in seqs: @@ -531,10 +549,10 @@ def test_binary(multiple_out=False, n_epochs=250): plt.plot(seq[seq_num]) ax1.set_title('input') ax2 = plt.subplot(212) - true_targets = plt.step(xrange(n_steps), targets[seq_num], marker='o') + true_targets = plt.step(range(n_steps), targets[seq_num], marker='o') guess = model.predict_proba(seq[seq_num]) - guessed_targets = plt.step(xrange(n_steps), guess) + guessed_targets = plt.step(range(n_steps), guess) plt.setp(guessed_targets, linestyle='--', marker='d') for i, x in enumerate(guessed_targets): x.set_color(true_targets[i].get_color()) @@ -574,7 +592,7 @@ def test_softmax(n_epochs=250): model.fit(seq, targets, validation_frequency=1000) - seqs = xrange(10) + seqs = range(10) plt.close('all') for seq_num in seqs: @@ -585,7 +603,7 @@ def test_softmax(n_epochs=250): ax2 = plt.subplot(212) # blue line will represent true classes - true_targets = plt.step(xrange(n_steps), targets[seq_num], marker='o') + true_targets = plt.step(range(n_steps), targets[seq_num], marker='o') # show probabilities (in b/w) output by model guess = model.predict_proba(seq[seq_num]) @@ -601,4 +619,4 @@ def test_softmax(n_epochs=250): # problem takes more epochs to solve #test_binary(multiple_out=True, n_epochs=2400) #test_softmax(n_epochs=250) - print "Elapsed time: %f" % (time.time() - t0) + print("Elapsed time: {}".format(time.time() - t0)) From e523a8613456bbd3233828b4a682065b807eecea Mon Sep 17 00:00:00 2001 From: TechBotBuilder Date: Sun, 3 Apr 2016 23:56:37 -0400 Subject: [PATCH 2/2] Add _get_params and set_params to MetaRNN Allows model to be saved and loaded from file --- rnn.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/rnn.py b/rnn.py index 3fba3a1..60877a4 100644 --- a/rnn.py +++ b/rnn.py @@ -135,12 +135,7 @@ def step(x_t, h_tm1): def mse(self, y): # error between output and target - ##EDITED BY MAX - #dontcare = T.isnan(y) - #y = T.set_subtensor(y[dontcare], self.y_pred[dontcare]) - #return T.mean((self.y_pred - y) ** 2) - care = T.nonzero(T.eq(T.isnan(y),0)) - return T.mean((self.y_pred[care] - y[care]) ** 2).sum() + return T.mean((self.y_pred - y) ** 2) def nll_binary(self, y): # negative log likelihood based on binary cross entropy error @@ -274,14 +269,14 @@ def shared_dataset(self, data_xy): else: return shared_x, shared_y - def _get_params(self):#added by max. was called but never defined. + def _get_params(self): """ Return parameters set in constructor. """ return [self.n_in, self.n_hidden, self.n_out, self.learning_rate, self.learning_rate_decay, self.n_epochs, self.L1_reg, self.L2_reg, self.activation, self.output_type, self.initial_momentum, self.final_momentum, self.momentum_switchover, self.use_symbolic_softmax] - def set_params(self, newparams):#added by max. was called but never defined. + def set_params(self, newparams): self.n_in, self.n_hidden, self.n_out, self.learning_rate = newparams[:4] self.learning_rate_decay, self.n_epochs, self.L1_reg, self.L2_reg = newparams[4:8] self.activation, self.output_type, self.initial_momentum = newparams[8:11]