In [1]:
import gzip
with gzip.open('d:/tmp/movie_data.csv.gz') as f_in, open('movie_data.csv', 'wb') as f_out:
    f_out.writelines(f_in)

In [2]:
import pyprind
import pandas as pd
from string import punctuation
import re
import numpy as np

df = pd.read_csv('movie_data.csv', encoding='utf-8')
df.head(3)


Out[2]:
review sentiment
0 In 1974, the teenager Martha Moxley (Maggie Gr... 1
1 OK... so... I really like Kris Kristofferson a... 0
2 ***SPOILER*** Do not read this, if you think a... 0

In [3]:
from collections import Counter


counts = Counter()
pbar = pyprind.ProgBar(len(df['review']),
                       title='Counting words occurences')
for i,review in enumerate(df['review']):
    text = ''.join([c if c not in punctuation else ' '+c+' ' \
                    for c in review]).lower()
    df.loc[i,'review'] = text
    pbar.update()
    counts.update(text.split())


Counting words occurences
0% [##############################] 100% | ETA: 00:00:00
Total time elapsed: 00:05:38

In [6]:
df.loc[0,'review']


Out[6]:
'in 1974 ,  the teenager martha moxley  ( maggie grace )  moves to the high - class area of belle haven ,  greenwich ,  connecticut .  on the mischief night ,  eve of halloween ,  she was murdered in the backyard of her house and her murder remained unsolved .  twenty - two years later ,  the writer mark fuhrman  ( christopher meloni )  ,  who is a former la detective that has fallen in disgrace for perjury in o . j .  simpson trial and moved to idaho ,  decides to investigate the case with his partner stephen weeks  ( andrew mitchell )  with the purpose of writing a book .  the locals squirm and do not welcome them ,  but with the support of the retired detective steve carroll  ( robert forster )  that was in charge of the investigation in the 70 \' s ,  they discover the criminal and a net of power and money to cover the murder .  < br  /  >  < br  /  >  " murder in greenwich "  is a good tv movie ,  with the true story of a murder of a fifteen years old girl that was committed by a wealthy teenager whose mother was a kennedy .  the powerful and rich family used their influence to cover the murder for more than twenty years .  however ,  a snoopy detective and convicted perjurer in disgrace was able to disclose how the hideous crime was committed .  the screenplay shows the investigation of mark and the last days of martha in parallel ,  but there is a lack of the emotion in the dramatization .  my vote is seven .  < br  /  >  < br  /  > title  ( brazil )  :  not available'

In [7]:
word_counts = sorted(counts, key=counts.get, reverse=True)
print(word_counts[:5])
word_to_int = {word: ii for ii, word in enumerate(word_counts, 1)}


['the', '.', ',', 'and', 'a']

In [16]:
print(word_counts[-15:])
word_to_int['penalised']


['penalised', 'adelade', 'bunki', 'explitive', 'damnedest', 'kitchenette', 'mechagodzilla', 'gamekeeper', 'synapsis', 'earlies', 'sagacity', 'himnan', 'shultz', 'tinian', 'movie\x97my']
Out[16]:
102952

In [17]:
mapped_reviews = []
pbar = pyprind.ProgBar(len(df['review']),
                       title='Map reviews to ints')
for review in df['review']:
    mapped_reviews.append([word_to_int[word] for word in review.split()])
    pbar.update()


Map reviews to ints
0% [##############################] 100% | ETA: 00:00:00
Total time elapsed: 00:00:10

In [19]:
len(mapped_reviews)


Out[19]:
50000

In [21]:
sequence_length = 200  ## sequence length (or T in our formulas)
sequences = np.zeros((len(mapped_reviews), sequence_length), dtype=int)
for i, row in enumerate(mapped_reviews):
    review_arr = np.array(row)
    sequences[i, -len(row):] = review_arr[-sequence_length:]

X_train = sequences[:25000, :]
y_train = df.loc[:25000, 'sentiment'].values
X_test = sequences[25000:, :]
y_test = df.loc[25000:, 'sentiment'].values


np.random.seed(123) # for reproducibility

## Function to generate minibatches:
def create_batch_generator(x, y=None, batch_size=64):
    n_batches = len(x)//batch_size
    x= x[:n_batches*batch_size]
    if y is not None:
        y = y[:n_batches*batch_size]
    for ii in range(0, len(x), batch_size):
        if y is not None:
            yield x[ii:ii+batch_size], y[ii:ii+batch_size]
        else:
            yield x[ii:ii+batch_size]

In [22]:
import tensorflow as tf


class SentimentRNN(object):
    def __init__(self, n_words, seq_len=200,
                 lstm_size=256, num_layers=1, batch_size=64,
                 learning_rate=0.0001, embed_size=200):
        self.n_words = n_words
        self.seq_len = seq_len
        self.lstm_size = lstm_size   ## number of hidden units
        self.num_layers = num_layers
        self.batch_size = batch_size
        self.learning_rate = learning_rate
        self.embed_size = embed_size

        self.g = tf.Graph()
        with self.g.as_default():
            tf.set_random_seed(123)
            self.build()
            self.saver = tf.train.Saver()
            self.init_op = tf.global_variables_initializer()

    def build(self):
        ## Define the placeholders
        tf_x = tf.placeholder(tf.int32,
                    shape=(self.batch_size, self.seq_len),
                    name='tf_x')
        tf_y = tf.placeholder(tf.float32,
                    shape=(self.batch_size),
                    name='tf_y')
        tf_keepprob = tf.placeholder(tf.float32,
                    name='tf_keepprob')
        ## Create the embedding layer
        embedding = tf.Variable(
                    tf.random_uniform(
                        (self.n_words, self.embed_size),
                        minval=-1, maxval=1),
                    name='embedding')
        embed_x = tf.nn.embedding_lookup(
                    embedding, tf_x, 
                    name='embeded_x')

        ## Define LSTM cell and stack them together
        cells = tf.contrib.rnn.MultiRNNCell(
                [tf.contrib.rnn.DropoutWrapper(
                   tf.contrib.rnn.BasicLSTMCell(self.lstm_size),
                   output_keep_prob=tf_keepprob)
                 for i in range(self.num_layers)])

        ## Define the initial state:
        self.initial_state = cells.zero_state(
                 self.batch_size, tf.float32)
        print('  << initial state >> ', self.initial_state)

        lstm_outputs, self.final_state = tf.nn.dynamic_rnn(
                 cells, embed_x,
                 initial_state=self.initial_state)
        ## Note: lstm_outputs shape: 
        ##  [batch_size, max_time, cells.output_size]
        print('\n  << lstm_output   >> ', lstm_outputs)
        print('\n  << final state   >> ', self.final_state)

        ## Apply a FC layer after on top of RNN output:
        logits = tf.layers.dense(
                 inputs=lstm_outputs[:, -1],
                 units=1, activation=None,
                 name='logits')
        
        logits = tf.squeeze(logits, name='logits_squeezed')
        print ('\n  << logits        >> ', logits)
        
        y_proba = tf.nn.sigmoid(logits, name='probabilities')
        predictions = {
            'probabilities': y_proba,
            'labels' : tf.cast(tf.round(y_proba), tf.int32,
                 name='labels')
        }
        print('\n  << predictions   >> ', predictions)

        ## Define the cost function
        cost = tf.reduce_mean(
                 tf.nn.sigmoid_cross_entropy_with_logits(
                 labels=tf_y, logits=logits),
                 name='cost')
        
        ## Define the optimizer
        optimizer = tf.train.AdamOptimizer(self.learning_rate)
        train_op = optimizer.minimize(cost, name='train_op')

    def train(self, X_train, y_train, num_epochs):
        with tf.Session(graph=self.g) as sess:
            sess.run(self.init_op)
            iteration = 1
            for epoch in range(num_epochs):
                state = sess.run(self.initial_state)
                
                for batch_x, batch_y in create_batch_generator(
                            X_train, y_train, self.batch_size):
                    feed = {'tf_x:0': batch_x,
                            'tf_y:0': batch_y,
                            'tf_keepprob:0': 0.5,
                            self.initial_state : state}
                    loss, _, state = sess.run(
                            ['cost:0', 'train_op', 
                             self.final_state],
                            feed_dict=feed)

                    if iteration % 20 == 0:
                        print("Epoch: %d/%d Iteration: %d "
                              "| Train loss: %.5f" % (
                               epoch + 1, num_epochs,
                               iteration, loss))

                    iteration +=1
                if (epoch+1)%10 == 0:
                    self.saver.save(sess,
                        "model/sentiment-%d.ckpt" % epoch)

    def predict(self, X_data, return_proba=False):
        preds = []
        with tf.Session(graph = self.g) as sess:
            self.saver.restore(
                sess, tf.train.latest_checkpoint('model/'))
            test_state = sess.run(self.initial_state)
            for ii, batch_x in enumerate(
                create_batch_generator(
                    X_data, None, batch_size=self.batch_size), 1):
                feed = {'tf_x:0' : batch_x,
                        'tf_keepprob:0': 1.0,
                        self.initial_state : test_state}
                if return_proba:
                    pred, test_state = sess.run(
                        ['probabilities:0', self.final_state],
                        feed_dict=feed)
                else:
                    pred, test_state = sess.run(
                        ['labels:0', self.final_state],
                        feed_dict=feed)
                    
                preds.append(pred)
                
        return np.concatenate(preds)

In [23]:
n_words = max(list(word_to_int.values())) + 1

rnn = SentimentRNN(n_words=n_words, 
                   seq_len=sequence_length,
                   embed_size=256, 
                   lstm_size=128, 
                   num_layers=1, 
                   batch_size=100, 
                   learning_rate=0.001)


  << initial state >>  (LSTMStateTuple(c=<tf.Tensor 'MultiRNNCellZeroState/DropoutWrapperZeroState/BasicLSTMCellZeroState/zeros:0' shape=(100, 128) dtype=float32>, h=<tf.Tensor 'MultiRNNCellZeroState/DropoutWrapperZeroState/BasicLSTMCellZeroState/zeros_1:0' shape=(100, 128) dtype=float32>),)

  << lstm_output   >>  Tensor("rnn/transpose:0", shape=(100, 200, 128), dtype=float32)

  << final state   >>  (LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_2:0' shape=(100, 128) dtype=float32>, h=<tf.Tensor 'rnn/while/Exit_3:0' shape=(100, 128) dtype=float32>),)

  << logits        >>  Tensor("logits_squeezed:0", shape=(100,), dtype=float32)

  << predictions   >>  {'probabilities': <tf.Tensor 'probabilities:0' shape=(100,) dtype=float32>, 'labels': <tf.Tensor 'labels:0' shape=(100,) dtype=int32>}

In [24]:
rnn.train(X_train, y_train, num_epochs=40)


Epoch: 1/40 Iteration: 20 | Train loss: 0.70424
Epoch: 1/40 Iteration: 40 | Train loss: 0.61183
Epoch: 1/40 Iteration: 60 | Train loss: 0.61106
Epoch: 1/40 Iteration: 80 | Train loss: 0.53204
Epoch: 1/40 Iteration: 100 | Train loss: 0.59602
Epoch: 1/40 Iteration: 120 | Train loss: 0.60881
Epoch: 1/40 Iteration: 140 | Train loss: 0.60886
Epoch: 1/40 Iteration: 160 | Train loss: 0.49927
Epoch: 1/40 Iteration: 180 | Train loss: 0.45666
Epoch: 1/40 Iteration: 200 | Train loss: 0.47791
Epoch: 1/40 Iteration: 220 | Train loss: 0.34807
Epoch: 1/40 Iteration: 240 | Train loss: 0.47828
Epoch: 2/40 Iteration: 260 | Train loss: 0.45152
Epoch: 2/40 Iteration: 280 | Train loss: 0.34978
Epoch: 2/40 Iteration: 300 | Train loss: 0.35281
Epoch: 2/40 Iteration: 320 | Train loss: 0.42379
Epoch: 2/40 Iteration: 340 | Train loss: 0.37396
Epoch: 2/40 Iteration: 360 | Train loss: 0.23252
Epoch: 2/40 Iteration: 380 | Train loss: 0.34016
Epoch: 2/40 Iteration: 400 | Train loss: 0.31848
Epoch: 2/40 Iteration: 420 | Train loss: 0.32594
Epoch: 2/40 Iteration: 440 | Train loss: 0.29692
Epoch: 2/40 Iteration: 460 | Train loss: 0.40545
Epoch: 2/40 Iteration: 480 | Train loss: 0.30537
Epoch: 2/40 Iteration: 500 | Train loss: 0.21484
Epoch: 3/40 Iteration: 520 | Train loss: 0.30231
Epoch: 3/40 Iteration: 540 | Train loss: 0.22195
Epoch: 3/40 Iteration: 560 | Train loss: 0.33078
Epoch: 3/40 Iteration: 580 | Train loss: 0.20907
Epoch: 3/40 Iteration: 600 | Train loss: 0.20347
Epoch: 3/40 Iteration: 620 | Train loss: 0.21980
Epoch: 3/40 Iteration: 640 | Train loss: 0.21325
Epoch: 3/40 Iteration: 660 | Train loss: 0.19944
Epoch: 3/40 Iteration: 680 | Train loss: 0.27544
Epoch: 3/40 Iteration: 700 | Train loss: 0.17961
Epoch: 3/40 Iteration: 720 | Train loss: 0.30727
Epoch: 3/40 Iteration: 740 | Train loss: 0.29388
Epoch: 4/40 Iteration: 760 | Train loss: 0.32948
Epoch: 4/40 Iteration: 780 | Train loss: 0.14631
Epoch: 4/40 Iteration: 800 | Train loss: 0.24968
Epoch: 4/40 Iteration: 820 | Train loss: 0.29956
Epoch: 4/40 Iteration: 840 | Train loss: 0.13340
Epoch: 4/40 Iteration: 860 | Train loss: 0.12557
Epoch: 4/40 Iteration: 880 | Train loss: 0.21185
Epoch: 4/40 Iteration: 900 | Train loss: 0.22761
Epoch: 4/40 Iteration: 920 | Train loss: 0.20540
Epoch: 4/40 Iteration: 940 | Train loss: 0.21112
Epoch: 4/40 Iteration: 960 | Train loss: 0.10475
Epoch: 4/40 Iteration: 980 | Train loss: 0.19961
Epoch: 4/40 Iteration: 1000 | Train loss: 0.17185
Epoch: 5/40 Iteration: 1020 | Train loss: 0.15091
Epoch: 5/40 Iteration: 1040 | Train loss: 0.11403
Epoch: 5/40 Iteration: 1060 | Train loss: 0.11919
Epoch: 5/40 Iteration: 1080 | Train loss: 0.06159
Epoch: 5/40 Iteration: 1100 | Train loss: 0.07042
Epoch: 5/40 Iteration: 1120 | Train loss: 0.11693
Epoch: 5/40 Iteration: 1140 | Train loss: 0.04947
Epoch: 5/40 Iteration: 1160 | Train loss: 0.08931
Epoch: 5/40 Iteration: 1180 | Train loss: 0.15010
Epoch: 5/40 Iteration: 1200 | Train loss: 0.10446
Epoch: 5/40 Iteration: 1220 | Train loss: 0.10561
Epoch: 5/40 Iteration: 1240 | Train loss: 0.13826
Epoch: 6/40 Iteration: 1260 | Train loss: 0.12773
Epoch: 6/40 Iteration: 1280 | Train loss: 0.04891
Epoch: 6/40 Iteration: 1300 | Train loss: 0.06573
Epoch: 6/40 Iteration: 1320 | Train loss: 0.12707
Epoch: 6/40 Iteration: 1340 | Train loss: 0.03880
Epoch: 6/40 Iteration: 1360 | Train loss: 0.01462
Epoch: 6/40 Iteration: 1380 | Train loss: 0.14458
Epoch: 6/40 Iteration: 1400 | Train loss: 0.19603
Epoch: 6/40 Iteration: 1420 | Train loss: 0.13234
Epoch: 6/40 Iteration: 1440 | Train loss: 0.12080
Epoch: 6/40 Iteration: 1460 | Train loss: 0.09918
Epoch: 6/40 Iteration: 1480 | Train loss: 0.32643
Epoch: 6/40 Iteration: 1500 | Train loss: 0.18917
Epoch: 7/40 Iteration: 1520 | Train loss: 0.11358
Epoch: 7/40 Iteration: 1540 | Train loss: 0.04186
Epoch: 7/40 Iteration: 1560 | Train loss: 0.15149
Epoch: 7/40 Iteration: 1580 | Train loss: 0.08349
Epoch: 7/40 Iteration: 1600 | Train loss: 0.07196
Epoch: 7/40 Iteration: 1620 | Train loss: 0.06855
Epoch: 7/40 Iteration: 1640 | Train loss: 0.03850
Epoch: 7/40 Iteration: 1660 | Train loss: 0.02402
Epoch: 7/40 Iteration: 1680 | Train loss: 0.07134
Epoch: 7/40 Iteration: 1700 | Train loss: 0.02482
Epoch: 7/40 Iteration: 1720 | Train loss: 0.06013
Epoch: 7/40 Iteration: 1740 | Train loss: 0.12926
Epoch: 8/40 Iteration: 1760 | Train loss: 0.18766
Epoch: 8/40 Iteration: 1780 | Train loss: 0.02377
Epoch: 8/40 Iteration: 1800 | Train loss: 0.06649
Epoch: 8/40 Iteration: 1820 | Train loss: 0.07428
Epoch: 8/40 Iteration: 1840 | Train loss: 0.02136
Epoch: 8/40 Iteration: 1860 | Train loss: 0.03109
Epoch: 8/40 Iteration: 1880 | Train loss: 0.06121
Epoch: 8/40 Iteration: 1900 | Train loss: 0.05645
Epoch: 8/40 Iteration: 1920 | Train loss: 0.06811
Epoch: 8/40 Iteration: 1940 | Train loss: 0.11794
Epoch: 8/40 Iteration: 1960 | Train loss: 0.04167
Epoch: 8/40 Iteration: 1980 | Train loss: 0.09831
Epoch: 8/40 Iteration: 2000 | Train loss: 0.12413
Epoch: 9/40 Iteration: 2020 | Train loss: 0.10441
Epoch: 9/40 Iteration: 2040 | Train loss: 0.04189
Epoch: 9/40 Iteration: 2060 | Train loss: 0.03810
Epoch: 9/40 Iteration: 2080 | Train loss: 0.06977
Epoch: 9/40 Iteration: 2100 | Train loss: 0.04174
Epoch: 9/40 Iteration: 2120 | Train loss: 0.05089
Epoch: 9/40 Iteration: 2140 | Train loss: 0.10769
Epoch: 9/40 Iteration: 2160 | Train loss: 0.01194
Epoch: 9/40 Iteration: 2180 | Train loss: 0.07675
Epoch: 9/40 Iteration: 2200 | Train loss: 0.00945
Epoch: 9/40 Iteration: 2220 | Train loss: 0.03848
Epoch: 9/40 Iteration: 2240 | Train loss: 0.04055
Epoch: 10/40 Iteration: 2260 | Train loss: 0.01193
Epoch: 10/40 Iteration: 2280 | Train loss: 0.02496
Epoch: 10/40 Iteration: 2300 | Train loss: 0.04737
Epoch: 10/40 Iteration: 2320 | Train loss: 0.08794
Epoch: 10/40 Iteration: 2340 | Train loss: 0.01397
Epoch: 10/40 Iteration: 2360 | Train loss: 0.01799
Epoch: 10/40 Iteration: 2380 | Train loss: 0.01694
Epoch: 10/40 Iteration: 2400 | Train loss: 0.01841
Epoch: 10/40 Iteration: 2420 | Train loss: 0.02500
Epoch: 10/40 Iteration: 2440 | Train loss: 0.05876
Epoch: 10/40 Iteration: 2460 | Train loss: 0.00889
Epoch: 10/40 Iteration: 2480 | Train loss: 0.03910
Epoch: 10/40 Iteration: 2500 | Train loss: 0.14413
Epoch: 11/40 Iteration: 2520 | Train loss: 0.01286
Epoch: 11/40 Iteration: 2540 | Train loss: 0.01698
Epoch: 11/40 Iteration: 2560 | Train loss: 0.05633
Epoch: 11/40 Iteration: 2580 | Train loss: 0.02630
Epoch: 11/40 Iteration: 2600 | Train loss: 0.02911
Epoch: 11/40 Iteration: 2620 | Train loss: 0.01950
Epoch: 11/40 Iteration: 2640 | Train loss: 0.00536
Epoch: 11/40 Iteration: 2660 | Train loss: 0.03230
Epoch: 11/40 Iteration: 2680 | Train loss: 0.02617
Epoch: 11/40 Iteration: 2700 | Train loss: 0.01302
Epoch: 11/40 Iteration: 2720 | Train loss: 0.24379
Epoch: 11/40 Iteration: 2740 | Train loss: 0.05889
Epoch: 12/40 Iteration: 2760 | Train loss: 0.02628
Epoch: 12/40 Iteration: 2780 | Train loss: 0.00201
Epoch: 12/40 Iteration: 2800 | Train loss: 0.01361
Epoch: 12/40 Iteration: 2820 | Train loss: 0.02728
Epoch: 12/40 Iteration: 2840 | Train loss: 0.00635
Epoch: 12/40 Iteration: 2860 | Train loss: 0.02932
Epoch: 12/40 Iteration: 2880 | Train loss: 0.03731
Epoch: 12/40 Iteration: 2900 | Train loss: 0.05221
Epoch: 12/40 Iteration: 2920 | Train loss: 0.00635
Epoch: 12/40 Iteration: 2940 | Train loss: 0.03244
Epoch: 12/40 Iteration: 2960 | Train loss: 0.00258
Epoch: 12/40 Iteration: 2980 | Train loss: 0.03248
Epoch: 12/40 Iteration: 3000 | Train loss: 0.08441
Epoch: 13/40 Iteration: 3020 | Train loss: 0.00965
Epoch: 13/40 Iteration: 3040 | Train loss: 0.00250
Epoch: 13/40 Iteration: 3060 | Train loss: 0.00427
Epoch: 13/40 Iteration: 3080 | Train loss: 0.01306
Epoch: 13/40 Iteration: 3100 | Train loss: 0.02269
Epoch: 13/40 Iteration: 3120 | Train loss: 0.02755
Epoch: 13/40 Iteration: 3140 | Train loss: 0.00597
Epoch: 13/40 Iteration: 3160 | Train loss: 0.03460
Epoch: 13/40 Iteration: 3180 | Train loss: 0.04567
Epoch: 13/40 Iteration: 3200 | Train loss: 0.03077
Epoch: 13/40 Iteration: 3220 | Train loss: 0.00506
Epoch: 13/40 Iteration: 3240 | Train loss: 0.01426
Epoch: 14/40 Iteration: 3260 | Train loss: 0.02584
Epoch: 14/40 Iteration: 3280 | Train loss: 0.00630
Epoch: 14/40 Iteration: 3300 | Train loss: 0.00920
Epoch: 14/40 Iteration: 3320 | Train loss: 0.00610
Epoch: 14/40 Iteration: 3340 | Train loss: 0.00763
Epoch: 14/40 Iteration: 3360 | Train loss: 0.00839
Epoch: 14/40 Iteration: 3380 | Train loss: 0.02747
Epoch: 14/40 Iteration: 3400 | Train loss: 0.01413
Epoch: 14/40 Iteration: 3420 | Train loss: 0.01748
Epoch: 14/40 Iteration: 3440 | Train loss: 0.00490
Epoch: 14/40 Iteration: 3460 | Train loss: 0.01617
Epoch: 14/40 Iteration: 3480 | Train loss: 0.00278
Epoch: 14/40 Iteration: 3500 | Train loss: 0.12844
Epoch: 15/40 Iteration: 3520 | Train loss: 0.00547
Epoch: 15/40 Iteration: 3540 | Train loss: 0.00136
Epoch: 15/40 Iteration: 3560 | Train loss: 0.00189
Epoch: 15/40 Iteration: 3580 | Train loss: 0.04200
Epoch: 15/40 Iteration: 3600 | Train loss: 0.01011
Epoch: 15/40 Iteration: 3620 | Train loss: 0.02527
Epoch: 15/40 Iteration: 3640 | Train loss: 0.05749
Epoch: 15/40 Iteration: 3660 | Train loss: 0.01403
Epoch: 15/40 Iteration: 3680 | Train loss: 0.00533
Epoch: 15/40 Iteration: 3700 | Train loss: 0.01574
Epoch: 15/40 Iteration: 3720 | Train loss: 0.00189
Epoch: 15/40 Iteration: 3740 | Train loss: 0.00268
Epoch: 16/40 Iteration: 3760 | Train loss: 0.00093
Epoch: 16/40 Iteration: 3780 | Train loss: 0.00288
Epoch: 16/40 Iteration: 3800 | Train loss: 0.01047
Epoch: 16/40 Iteration: 3820 | Train loss: 0.00107
Epoch: 16/40 Iteration: 3840 | Train loss: 0.04477
Epoch: 16/40 Iteration: 3860 | Train loss: 0.00152
Epoch: 16/40 Iteration: 3880 | Train loss: 0.03170
Epoch: 16/40 Iteration: 3900 | Train loss: 0.00194
Epoch: 16/40 Iteration: 3920 | Train loss: 0.00212
Epoch: 16/40 Iteration: 3940 | Train loss: 0.00142
Epoch: 16/40 Iteration: 3960 | Train loss: 0.00042
Epoch: 16/40 Iteration: 3980 | Train loss: 0.00134
Epoch: 16/40 Iteration: 4000 | Train loss: 0.01259
Epoch: 17/40 Iteration: 4020 | Train loss: 0.00089
Epoch: 17/40 Iteration: 4040 | Train loss: 0.00109
Epoch: 17/40 Iteration: 4060 | Train loss: 0.00090
Epoch: 17/40 Iteration: 4080 | Train loss: 0.05377
Epoch: 17/40 Iteration: 4100 | Train loss: 0.00169
Epoch: 17/40 Iteration: 4120 | Train loss: 0.00118
Epoch: 17/40 Iteration: 4140 | Train loss: 0.00066
Epoch: 17/40 Iteration: 4160 | Train loss: 0.00237
Epoch: 17/40 Iteration: 4180 | Train loss: 0.00080
Epoch: 17/40 Iteration: 4200 | Train loss: 0.00060
Epoch: 17/40 Iteration: 4220 | Train loss: 0.00071
Epoch: 17/40 Iteration: 4240 | Train loss: 0.00414
Epoch: 18/40 Iteration: 4260 | Train loss: 0.00098
Epoch: 18/40 Iteration: 4280 | Train loss: 0.00242
Epoch: 18/40 Iteration: 4300 | Train loss: 0.00072
Epoch: 18/40 Iteration: 4320 | Train loss: 0.00038
Epoch: 18/40 Iteration: 4340 | Train loss: 0.01033
Epoch: 18/40 Iteration: 4360 | Train loss: 0.00165
Epoch: 18/40 Iteration: 4380 | Train loss: 0.00068
Epoch: 18/40 Iteration: 4400 | Train loss: 0.00511
Epoch: 18/40 Iteration: 4420 | Train loss: 0.00145
Epoch: 18/40 Iteration: 4440 | Train loss: 0.00350
Epoch: 18/40 Iteration: 4460 | Train loss: 0.00505
Epoch: 18/40 Iteration: 4480 | Train loss: 0.00387
Epoch: 18/40 Iteration: 4500 | Train loss: 0.00481
Epoch: 19/40 Iteration: 4520 | Train loss: 0.00027
Epoch: 19/40 Iteration: 4540 | Train loss: 0.00080
Epoch: 19/40 Iteration: 4560 | Train loss: 0.00512
Epoch: 19/40 Iteration: 4580 | Train loss: 0.00057
Epoch: 19/40 Iteration: 4600 | Train loss: 0.00074
Epoch: 19/40 Iteration: 4620 | Train loss: 0.00246
Epoch: 19/40 Iteration: 4640 | Train loss: 0.00028
Epoch: 19/40 Iteration: 4660 | Train loss: 0.00034
Epoch: 19/40 Iteration: 4680 | Train loss: 0.00034
Epoch: 19/40 Iteration: 4700 | Train loss: 0.00027
Epoch: 19/40 Iteration: 4720 | Train loss: 0.00031
Epoch: 19/40 Iteration: 4740 | Train loss: 0.00018
Epoch: 20/40 Iteration: 4760 | Train loss: 0.00018
Epoch: 20/40 Iteration: 4780 | Train loss: 0.00022
Epoch: 20/40 Iteration: 4800 | Train loss: 0.00043
Epoch: 20/40 Iteration: 4820 | Train loss: 0.00056
Epoch: 20/40 Iteration: 4840 | Train loss: 0.00023
Epoch: 20/40 Iteration: 4860 | Train loss: 0.00020
Epoch: 20/40 Iteration: 4880 | Train loss: 0.00095
Epoch: 20/40 Iteration: 4900 | Train loss: 0.00268
Epoch: 20/40 Iteration: 4920 | Train loss: 0.00016
Epoch: 20/40 Iteration: 4940 | Train loss: 0.00038
Epoch: 20/40 Iteration: 4960 | Train loss: 0.00019
Epoch: 20/40 Iteration: 4980 | Train loss: 0.00027
Epoch: 20/40 Iteration: 5000 | Train loss: 0.00027
Epoch: 21/40 Iteration: 5020 | Train loss: 0.00014
Epoch: 21/40 Iteration: 5040 | Train loss: 0.00004
Epoch: 21/40 Iteration: 5060 | Train loss: 0.00015
Epoch: 21/40 Iteration: 5080 | Train loss: 0.00013
Epoch: 21/40 Iteration: 5100 | Train loss: 0.00026
Epoch: 21/40 Iteration: 5120 | Train loss: 0.00021
Epoch: 21/40 Iteration: 5140 | Train loss: 0.00018
Epoch: 21/40 Iteration: 5160 | Train loss: 0.00007
Epoch: 21/40 Iteration: 5180 | Train loss: 0.00008
Epoch: 21/40 Iteration: 5200 | Train loss: 0.00006
Epoch: 21/40 Iteration: 5220 | Train loss: 0.00009
Epoch: 21/40 Iteration: 5240 | Train loss: 0.00005
Epoch: 22/40 Iteration: 5260 | Train loss: 0.00008
Epoch: 22/40 Iteration: 5280 | Train loss: 0.00011
Epoch: 22/40 Iteration: 5300 | Train loss: 0.00018
Epoch: 22/40 Iteration: 5320 | Train loss: 0.00022
Epoch: 22/40 Iteration: 5340 | Train loss: 0.00033
Epoch: 22/40 Iteration: 5360 | Train loss: 0.00020
Epoch: 22/40 Iteration: 5380 | Train loss: 0.00025
Epoch: 22/40 Iteration: 5400 | Train loss: 0.00005
Epoch: 22/40 Iteration: 5420 | Train loss: 0.00002
Epoch: 22/40 Iteration: 5440 | Train loss: 0.00017
Epoch: 22/40 Iteration: 5460 | Train loss: 0.00004
Epoch: 22/40 Iteration: 5480 | Train loss: 0.00025
Epoch: 22/40 Iteration: 5500 | Train loss: 0.00026
Epoch: 23/40 Iteration: 5520 | Train loss: 0.00002
Epoch: 23/40 Iteration: 5540 | Train loss: 0.00002
Epoch: 23/40 Iteration: 5560 | Train loss: 0.00012
Epoch: 23/40 Iteration: 5580 | Train loss: 0.00006
Epoch: 23/40 Iteration: 5600 | Train loss: 0.00014
Epoch: 23/40 Iteration: 5620 | Train loss: 0.00004
Epoch: 23/40 Iteration: 5640 | Train loss: 0.00001
Epoch: 23/40 Iteration: 5660 | Train loss: 0.00009
Epoch: 23/40 Iteration: 5680 | Train loss: 0.00016
Epoch: 23/40 Iteration: 5700 | Train loss: 0.00002
Epoch: 23/40 Iteration: 5720 | Train loss: 0.00009
Epoch: 23/40 Iteration: 5740 | Train loss: 0.00005
Epoch: 24/40 Iteration: 5760 | Train loss: 0.00010
Epoch: 24/40 Iteration: 5780 | Train loss: 0.00014
Epoch: 24/40 Iteration: 5800 | Train loss: 0.00010
Epoch: 24/40 Iteration: 5820 | Train loss: 0.00014
Epoch: 24/40 Iteration: 5840 | Train loss: 0.00009
Epoch: 24/40 Iteration: 5860 | Train loss: 0.00029
Epoch: 24/40 Iteration: 5880 | Train loss: 0.00006
Epoch: 24/40 Iteration: 5900 | Train loss: 0.00004
Epoch: 24/40 Iteration: 5920 | Train loss: 0.00007
Epoch: 24/40 Iteration: 5940 | Train loss: 0.00025
Epoch: 24/40 Iteration: 5960 | Train loss: 0.00002
Epoch: 24/40 Iteration: 5980 | Train loss: 0.00008
Epoch: 24/40 Iteration: 6000 | Train loss: 0.00020
Epoch: 25/40 Iteration: 6020 | Train loss: 0.00003
Epoch: 25/40 Iteration: 6040 | Train loss: 0.00001
Epoch: 25/40 Iteration: 6060 | Train loss: 0.00005
Epoch: 25/40 Iteration: 6080 | Train loss: 0.00003
Epoch: 25/40 Iteration: 6100 | Train loss: 0.00007
Epoch: 25/40 Iteration: 6120 | Train loss: 0.00006
Epoch: 25/40 Iteration: 6140 | Train loss: 0.00002
Epoch: 25/40 Iteration: 6160 | Train loss: 0.00007
Epoch: 25/40 Iteration: 6180 | Train loss: 0.00012
Epoch: 25/40 Iteration: 6200 | Train loss: 0.00001
Epoch: 25/40 Iteration: 6220 | Train loss: 0.00002
Epoch: 25/40 Iteration: 6240 | Train loss: 0.00007
Epoch: 26/40 Iteration: 6260 | Train loss: 0.00003
Epoch: 26/40 Iteration: 6280 | Train loss: 0.00004
Epoch: 26/40 Iteration: 6300 | Train loss: 0.00002
Epoch: 26/40 Iteration: 6320 | Train loss: 0.00002
Epoch: 26/40 Iteration: 6340 | Train loss: 0.00005
Epoch: 26/40 Iteration: 6360 | Train loss: 0.00002
Epoch: 26/40 Iteration: 6380 | Train loss: 0.00006
Epoch: 26/40 Iteration: 6400 | Train loss: 0.00004
Epoch: 26/40 Iteration: 6420 | Train loss: 0.00002
Epoch: 26/40 Iteration: 6440 | Train loss: 0.00003
Epoch: 26/40 Iteration: 6460 | Train loss: 0.00001
Epoch: 26/40 Iteration: 6480 | Train loss: 0.00003
Epoch: 26/40 Iteration: 6500 | Train loss: 0.00014
Epoch: 27/40 Iteration: 6520 | Train loss: 0.00002
Epoch: 27/40 Iteration: 6540 | Train loss: 0.00002
Epoch: 27/40 Iteration: 6560 | Train loss: 0.00002
Epoch: 27/40 Iteration: 6580 | Train loss: 0.00001
Epoch: 27/40 Iteration: 6600 | Train loss: 0.00006
Epoch: 27/40 Iteration: 6620 | Train loss: 0.00002
Epoch: 27/40 Iteration: 6640 | Train loss: 0.00001
Epoch: 27/40 Iteration: 6660 | Train loss: 0.00004
Epoch: 27/40 Iteration: 6680 | Train loss: 0.00002
Epoch: 27/40 Iteration: 6700 | Train loss: 0.00001
Epoch: 27/40 Iteration: 6720 | Train loss: 0.00001
Epoch: 27/40 Iteration: 6740 | Train loss: 0.00001
Epoch: 28/40 Iteration: 6760 | Train loss: 0.00000
Epoch: 28/40 Iteration: 6780 | Train loss: 0.00002
Epoch: 28/40 Iteration: 6800 | Train loss: 0.00004
Epoch: 28/40 Iteration: 6820 | Train loss: 0.00005
Epoch: 28/40 Iteration: 6840 | Train loss: 0.00002
Epoch: 28/40 Iteration: 6860 | Train loss: 0.00002
Epoch: 28/40 Iteration: 6880 | Train loss: 0.00005
Epoch: 28/40 Iteration: 6900 | Train loss: 0.00003
Epoch: 28/40 Iteration: 6920 | Train loss: 0.00002
Epoch: 28/40 Iteration: 6940 | Train loss: 0.00006
Epoch: 28/40 Iteration: 6960 | Train loss: 0.00000
Epoch: 28/40 Iteration: 6980 | Train loss: 0.00003
Epoch: 28/40 Iteration: 7000 | Train loss: 0.00002
Epoch: 29/40 Iteration: 7020 | Train loss: 0.00000
Epoch: 29/40 Iteration: 7040 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7060 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7080 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7100 | Train loss: 0.00006
Epoch: 29/40 Iteration: 7120 | Train loss: 0.00002
Epoch: 29/40 Iteration: 7140 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7160 | Train loss: 0.00002
Epoch: 29/40 Iteration: 7180 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7200 | Train loss: 0.00002
Epoch: 29/40 Iteration: 7220 | Train loss: 0.00001
Epoch: 29/40 Iteration: 7240 | Train loss: 0.00001
Epoch: 30/40 Iteration: 7260 | Train loss: 0.00001
Epoch: 30/40 Iteration: 7280 | Train loss: 0.00002
Epoch: 30/40 Iteration: 7300 | Train loss: 0.00003
Epoch: 30/40 Iteration: 7320 | Train loss: 0.00005
Epoch: 30/40 Iteration: 7340 | Train loss: 0.00003
Epoch: 30/40 Iteration: 7360 | Train loss: 0.00001
Epoch: 30/40 Iteration: 7380 | Train loss: 0.00002
Epoch: 30/40 Iteration: 7400 | Train loss: 0.00001
Epoch: 30/40 Iteration: 7420 | Train loss: 0.00001
Epoch: 30/40 Iteration: 7440 | Train loss: 0.00002
Epoch: 30/40 Iteration: 7460 | Train loss: 0.00000
Epoch: 30/40 Iteration: 7480 | Train loss: 0.00050
Epoch: 30/40 Iteration: 7500 | Train loss: 0.00001
Epoch: 31/40 Iteration: 7520 | Train loss: 0.00001
Epoch: 31/40 Iteration: 7540 | Train loss: 0.00000
Epoch: 31/40 Iteration: 7560 | Train loss: 0.00001
Epoch: 31/40 Iteration: 7580 | Train loss: 0.00001
Epoch: 31/40 Iteration: 7600 | Train loss: 0.00009
Epoch: 31/40 Iteration: 7620 | Train loss: 0.00003
Epoch: 31/40 Iteration: 7640 | Train loss: 0.00000
Epoch: 31/40 Iteration: 7660 | Train loss: 0.00002
Epoch: 31/40 Iteration: 7680 | Train loss: 0.00002
Epoch: 31/40 Iteration: 7700 | Train loss: 0.00000
Epoch: 31/40 Iteration: 7720 | Train loss: 0.00001
Epoch: 31/40 Iteration: 7740 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7760 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7780 | Train loss: 0.00002
Epoch: 32/40 Iteration: 7800 | Train loss: 0.00000
Epoch: 32/40 Iteration: 7820 | Train loss: 0.00002
Epoch: 32/40 Iteration: 7840 | Train loss: 0.00002
Epoch: 32/40 Iteration: 7860 | Train loss: 0.00002
Epoch: 32/40 Iteration: 7880 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7900 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7920 | Train loss: 0.00005
Epoch: 32/40 Iteration: 7940 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7960 | Train loss: 0.00001
Epoch: 32/40 Iteration: 7980 | Train loss: 0.00006
Epoch: 32/40 Iteration: 8000 | Train loss: 0.00007
Epoch: 33/40 Iteration: 8020 | Train loss: 0.00007
Epoch: 33/40 Iteration: 8040 | Train loss: 0.00000
Epoch: 33/40 Iteration: 8060 | Train loss: 0.00000
Epoch: 33/40 Iteration: 8080 | Train loss: 0.00001
Epoch: 33/40 Iteration: 8100 | Train loss: 0.00001
Epoch: 33/40 Iteration: 8120 | Train loss: 0.00002
Epoch: 33/40 Iteration: 8140 | Train loss: 0.00001
Epoch: 33/40 Iteration: 8160 | Train loss: 0.00001
Epoch: 33/40 Iteration: 8180 | Train loss: 0.00001
Epoch: 33/40 Iteration: 8200 | Train loss: 0.00000
Epoch: 33/40 Iteration: 8220 | Train loss: 0.00000
Epoch: 33/40 Iteration: 8240 | Train loss: 0.00000
Epoch: 34/40 Iteration: 8260 | Train loss: 0.00000
Epoch: 34/40 Iteration: 8280 | Train loss: 0.00001
Epoch: 34/40 Iteration: 8300 | Train loss: 0.00001
Epoch: 34/40 Iteration: 8320 | Train loss: 0.00003
Epoch: 34/40 Iteration: 8340 | Train loss: 0.00018
Epoch: 34/40 Iteration: 8360 | Train loss: 0.00001
Epoch: 34/40 Iteration: 8380 | Train loss: 0.00002
Epoch: 34/40 Iteration: 8400 | Train loss: 0.00000
Epoch: 34/40 Iteration: 8420 | Train loss: 0.00006
Epoch: 34/40 Iteration: 8440 | Train loss: 0.00007
Epoch: 34/40 Iteration: 8460 | Train loss: 0.00001
Epoch: 34/40 Iteration: 8480 | Train loss: 0.00000
Epoch: 34/40 Iteration: 8500 | Train loss: 0.00001
Epoch: 35/40 Iteration: 8520 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8540 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8560 | Train loss: 0.00001
Epoch: 35/40 Iteration: 8580 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8600 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8620 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8640 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8660 | Train loss: 0.00001
Epoch: 35/40 Iteration: 8680 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8700 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8720 | Train loss: 0.00000
Epoch: 35/40 Iteration: 8740 | Train loss: 0.00000
Epoch: 36/40 Iteration: 8760 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8780 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8800 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8820 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8840 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8860 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8880 | Train loss: 0.00000
Epoch: 36/40 Iteration: 8900 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8920 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8940 | Train loss: 0.00001
Epoch: 36/40 Iteration: 8960 | Train loss: 0.00000
Epoch: 36/40 Iteration: 8980 | Train loss: 0.00004
Epoch: 36/40 Iteration: 9000 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9020 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9040 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9060 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9080 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9100 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9120 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9140 | Train loss: 0.00000
Epoch: 37/40 Iteration: 9160 | Train loss: 0.00001
Epoch: 37/40 Iteration: 9180 | Train loss: 0.04381
Epoch: 37/40 Iteration: 9200 | Train loss: 0.15328
Epoch: 37/40 Iteration: 9220 | Train loss: 0.09405
Epoch: 37/40 Iteration: 9240 | Train loss: 0.02051
Epoch: 38/40 Iteration: 9260 | Train loss: 0.10751
Epoch: 38/40 Iteration: 9280 | Train loss: 0.01811
Epoch: 38/40 Iteration: 9300 | Train loss: 0.03967
Epoch: 38/40 Iteration: 9320 | Train loss: 0.07729
Epoch: 38/40 Iteration: 9340 | Train loss: 0.02859
Epoch: 38/40 Iteration: 9360 | Train loss: 0.05374
Epoch: 38/40 Iteration: 9380 | Train loss: 0.05944
Epoch: 38/40 Iteration: 9400 | Train loss: 0.16259
Epoch: 38/40 Iteration: 9420 | Train loss: 0.03607
Epoch: 38/40 Iteration: 9440 | Train loss: 0.01499
Epoch: 38/40 Iteration: 9460 | Train loss: 0.01970
Epoch: 38/40 Iteration: 9480 | Train loss: 0.00087
Epoch: 38/40 Iteration: 9500 | Train loss: 0.02273
Epoch: 39/40 Iteration: 9520 | Train loss: 0.05159
Epoch: 39/40 Iteration: 9540 | Train loss: 0.01552
Epoch: 39/40 Iteration: 9560 | Train loss: 0.00981
Epoch: 39/40 Iteration: 9580 | Train loss: 0.05864
Epoch: 39/40 Iteration: 9600 | Train loss: 0.00198
Epoch: 39/40 Iteration: 9620 | Train loss: 0.00216
Epoch: 39/40 Iteration: 9640 | Train loss: 0.00118
Epoch: 39/40 Iteration: 9660 | Train loss: 0.00127
Epoch: 39/40 Iteration: 9680 | Train loss: 0.00139
Epoch: 39/40 Iteration: 9700 | Train loss: 0.00033
Epoch: 39/40 Iteration: 9720 | Train loss: 0.00214
Epoch: 39/40 Iteration: 9740 | Train loss: 0.00179
Epoch: 40/40 Iteration: 9760 | Train loss: 0.02597
Epoch: 40/40 Iteration: 9780 | Train loss: 0.00231
Epoch: 40/40 Iteration: 9800 | Train loss: 0.01474
Epoch: 40/40 Iteration: 9820 | Train loss: 0.00030
Epoch: 40/40 Iteration: 9840 | Train loss: 0.00078
Epoch: 40/40 Iteration: 9860 | Train loss: 0.00215
Epoch: 40/40 Iteration: 9880 | Train loss: 0.00473
Epoch: 40/40 Iteration: 9900 | Train loss: 0.00016
Epoch: 40/40 Iteration: 9920 | Train loss: 0.00073
Epoch: 40/40 Iteration: 9940 | Train loss: 0.00087
Epoch: 40/40 Iteration: 9960 | Train loss: 0.00016
Epoch: 40/40 Iteration: 9980 | Train loss: 0.00075
Epoch: 40/40 Iteration: 10000 | Train loss: 0.00065

In [ ]:
## Test: 
preds = rnn.predict(X_test)
y_true = y_test[:len(preds)]
print('Test Acc.: %.3f' % (
      np.sum(preds == y_true) / len(y_true)))

In [ ]:
## Get probabilities:
proba = rnn.predict(X_test, return_proba=True)