In [1]:
import numpy as np
import datetime

from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, GRU
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence


Using Theano backend.

In [2]:
class RNN:
    '''
    RNN classifier
    '''
    def __init__(self, train_x, train_y, test_x, test_y, dict_size=5000, example_length=500, embedding_length=32, epochs=15, batch_size=128):
        '''
        initialize RNN model
        :param train_x: training data
        :param train_y: training label
        :param test_x: test data
        :param test_y: test label
        :param epoches:
        :param batch_size:
        '''
        self.batch_size = batch_size
        self.epochs = epochs
        self.example_len = example_length
        self.dict_size = dict_size
        self.embedding_len = embedding_length

        # TODO:preprocess training data
        self.train_x = sequence.pad_sequences(train_x, maxlen=example_length)
        self.test_x = sequence.pad_sequences(test_x, maxlen=example_length)
        self.train_y = train_y
        self.test_y = test_y

        # TODO:build model
        # create the model
        model = Sequential()
        model.add(Embedding(dict_size, embedding_length, input_length=example_length))
        model.add(GRU(100, dropout=0.2, recurrent_dropout=0.2))
        model.add(Dense(1, activation='sigmoid'))
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        print(model.summary())
        self.model = model


    def train(self):
        '''
        fit in data and train model
        :return:
        '''
        # TODO: fit in data to train your model
        self.model.fit(self.train_x, self.train_y,\
                validation_data=(self.test_x, self.test_y),\
                       epochs=self.epochs, batch_size=self.batch_size)


    def evaluate(self):
        '''
        evaluate trained model
        :return:
        '''
        return self.model.evaluate(self.test_x, self.test_y)

In [3]:
time = datetime.datetime.now()
print (time )
(train_x, train_y), (test_x, test_y) = imdb.load_data(num_words=5000)
rnn = RNN(train_x, train_y, test_x, test_y)
rnn.train()
rnn.evaluate()

print (datetime.datetime.now() - time)


2017-10-08 21:26:54.849573
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, 500, 32)           160000    
_________________________________________________________________
gru_1 (GRU)                  (None, 100)               39900     
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 101       
=================================================================
Total params: 200,001
Trainable params: 200,001
Non-trainable params: 0
_________________________________________________________________
None
WARNING (theano.gof.compilelock): Overriding existing lock by dead process '62899' (I am process '62955')
Train on 25000 samples, validate on 25000 samples
Epoch 1/15
 8576/25000 [=========>....................] - ETA: 1347s - loss: 0.6737 - acc: 0.5919
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-3-1a4b94b6e8a1> in <module>()
      3 (train_x, train_y), (test_x, test_y) = imdb.load_data(num_words=5000)
      4 rnn = RNN(train_x, train_y, test_x, test_y)
----> 5 rnn.train()
      6 rnn.evaluate()
      7 

<ipython-input-2-3244d46b53f2> in train(self)
     42         '''
     43         # TODO: fit in data to train your model
---> 44         self.model.fit(self.train_x, self.train_y,                validation_data=(self.test_x, self.test_y),                       epochs=self.epochs, batch_size=self.batch_size)
     45 
     46 

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/keras/models.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    861                               class_weight=class_weight,
    862                               sample_weight=sample_weight,
--> 863                               initial_epoch=initial_epoch)
    864 
    865     def evaluate(self, x, y, batch_size=32, verbose=1,

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
   1428                               val_f=val_f, val_ins=val_ins, shuffle=shuffle,
   1429                               callback_metrics=callback_metrics,
-> 1430                               initial_epoch=initial_epoch)
   1431 
   1432     def evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None):

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/keras/engine/training.py in _fit_loop(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch)
   1077                 batch_logs['size'] = len(batch_ids)
   1078                 callbacks.on_batch_begin(batch_index, batch_logs)
-> 1079                 outs = f(ins_batch)
   1080                 if not isinstance(outs, list):
   1081                     outs = [outs]

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/keras/backend/theano_backend.py in __call__(self, inputs)
   1195     def __call__(self, inputs):
   1196         assert isinstance(inputs, (list, tuple))
-> 1197         return self.function(*inputs)
   1198 
   1199 

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/theano/compile/function_module.py in __call__(self, *args, **kwargs)
    882         try:
    883             outputs =\
--> 884                 self.fn() if output_subset is None else\
    885                 self.fn(output_subset=output_subset)
    886         except Exception:

~/anaconda2/envs/hwenv/lib/python3.6/site-packages/theano/ifelse.py in thunk()
    244         outputs = node.outputs
    245 
--> 246         def thunk():
    247             if not compute_map[cond][0]:
    248                 return [0]

KeyboardInterrupt: 

In [ ]: