In [104]:
import numpy as np
import keras
from keras.datasets import reuters
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Embedding
from keras.layers import Bidirectional, TimeDistributed, GRU
from keras.layers import LSTM, Input, Reshape, Concatenate, Flatten,Convolution1D
from keras.layers import Conv1D, Conv2D, GlobalMaxPooling1D, MaxPooling1D, MaxPool2D
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.optimizers import Adam, SGD
from keras.models import Model
from keras.callbacks import ModelCheckpoint, EarlyStopping

from sklearn.model_selection import train_test_split

import pandas as pd

import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')

In [141]:
data_train = pd.read_csv('result_all_windows_labels.csv')

# Cleanup - remove no labels
data_train = data_train[data_train['label'].notnull()]
data_train = data_train[data_train.label != 'environmental']
data_train = data_train[data_train.label != 'religious']
data_train = data_train[data_train.label != 'economical']


label_cat = {'violence/terrorism' : 0, 'misc': 1, 'political': 2, 
#              'religious': 4, 'economical': 5, 'environmental': 6
            }
print(label_cat) 


def to_category(x):
    return label_cat[x]

data_train['target'] = data_train.apply(lambda row: to_category(row['label']), axis=1)


data_train['target'].plot.hist(alpha=0.5)


texts = []
# Get corpus by joining all keywords
for index, row in data_train.iloc[ :, 2:32].iterrows():
    texts.append(u' '.join(row.tolist()))
    
data_train['topicFlat'] = texts

# texts = datdata_traina_train['topicFlat']
labels = data_train['target']

print(labels)
data_train['topicFlat'].head()


{'political': 2, 'misc': 1, 'violence/terrorism': 0}
0       0
1       1
2       1
3       1
4       0
5       1
6       1
7       1
8       2
9       1
10      1
11      2
12      2
13      1
14      0
15      2
16      1
17      1
18      1
19      2
20      2
21      0
22      0
23      1
24      0
25      1
26      2
27      0
28      1
29      1
       ..
1516    1
1517    0
1518    2
1519    1
1520    2
1521    2
1522    2
1523    2
1524    1
1525    1
1526    2
1527    0
1528    0
1529    2
1530    0
1531    0
1532    0
1533    0
1534    0
1535    0
1536    0
1537    1
1538    0
1539    1
1540    2
1541    1
1542    2
1543    2
1544    1
1545    0
Name: target, Length: 1449, dtype: int64
Out[141]:
0    syrian assad say syria killed damascus people ...
1    use osc copyrighted_material dissemination usa...
2    will year can people one country party make sa...
3    quot apos say the we it reuters terrorists ass...
4    baghdad iraq sunni killed bomb iraqi attacks w...
Name: topicFlat, dtype: object

In [3]:
def plot_history(history):
    # list all data in history
    print(history.history.keys())
    # summarize history for accuracy
    plt.plot(history.history['acc'])
    plt.plot(history.history['val_acc'])
    plt.title('model accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.show()
    # summarize history for loss
    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.title('model loss')
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.legend(['train', 'test'], loc='upper left')
    plt.show()

Emedding


In [14]:


In [126]:
max_words = 10000
MAX_SEQUENCE_LENGTH = 500
EMBEDDING_DIM = 100 


print('Loading data...')
# (x_train, y_train), (x_test, y_test) = reuters.load_data(num_words=max_words,
#                                                          test_split=0.2)

# X = data_train['topicFlat'].values
Y = pd.get_dummies(data_train['label']).values
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(data_train['topicFlat'].values)
X = tokenizer.texts_to_sequences(data_train['topicFlat'].values)
print(X[0])


word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))


# Define the max seq length based on mar
# MAX_SEQUENCE_LENGTH = len(word_index)


X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)
# print(X[0])

x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, 
                                                    random_state = 4)

print(y_train[100])
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')

num_classes = y_train.shape[1]
print(num_classes, 'classes')

# print('Vectorizing sequence data...')
# x_train = tokenizer.sequences_to_matrix(x_train, mode='binary')
# x_test = tokenizer.sequences_to_matrix(x_test, mode='binary')
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)

print('Converted class vector to binary class matrix '
      '(for use with categorical_crossentropy)')
# y_train = keras.utils.to_categorical(y_train, num_classes)
# y_test = keras.utils.to_categorical(y_test, num_classes)
print('y_train shape:', y_train.shape)
print('y_test shape:', y_test.shape)


Loading data...
[4, 17, 1, 2, 16, 42, 7, 47, 178, 56, 30, 1014, 395, 8, 160, 22, 38, 12, 201, 3300, 142, 10, 3, 17, 1640, 202, 433, 396, 307, 82, 145, 649]
Found 6077 unique tokens.
[0 1 0]
(1159, 500) (1159, 3)
(290, 500) (290, 3)
1159 train sequences
290 test sequences
3 classes
x_train shape: (1159, 500)
x_test shape: (290, 500)
Converted class vector to binary class matrix (for use with categorical_crossentropy)
y_train shape: (1159, 3)
y_test shape: (290, 3)

In [127]:
embeddings_index = {}
f = open( 'data/glove.6B.100d.txt')
for line in f:
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
f.close()

print('Found %s word vectors.' % len(embeddings_index))


Found 400000 word vectors.

In [128]:
embedding_matrix = np.zeros((len(word_index) + 1, EMBEDDING_DIM))
for word, i in word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector
        
#
embedding_layer = Embedding(len(word_index) + 1,
                            EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=MAX_SEQUENCE_LENGTH,
                            trainable=False)

In [124]:
# https://richliao.github.io/supervised/classification/2016/12/26/textclassifier-RNN/
# 81%
epochs=10
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
preds = Dense(num_classes, activation='softmax')(l_lstm)

model = Model(sequence_input, preds)

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print("model fitting - Bidirectional LSTM")
model.summary()
network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs,
                    verbose=1,
                    validation_split=0.2)


score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)

print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


model fitting - Bidirectional LSTM
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_55 (InputLayer)        (None, 500)               0         
_________________________________________________________________
embedding_66 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
bidirectional_33 (Bidirectio (None, 200)               160800    
_________________________________________________________________
dense_108 (Dense)            (None, 3)                 603       
=================================================================
Total params: 769,203
Trainable params: 769,203
Non-trainable params: 0
_________________________________________________________________
Train on 1159 samples, validate on 290 samples
Epoch 1/10
1159/1159 [==============================] - 129s 111ms/step - loss: 0.5228 - acc: 0.7972 - val_loss: 0.5065 - val_acc: 0.8000
Epoch 2/10
1159/1159 [==============================] - 151s 130ms/step - loss: 0.2073 - acc: 0.9292 - val_loss: 0.4682 - val_acc: 0.8379
Epoch 3/10
1159/1159 [==============================] - 155s 133ms/step - loss: 0.1405 - acc: 0.9594 - val_loss: 0.9109 - val_acc: 0.7621
Epoch 4/10
1159/1159 [==============================] - 148s 128ms/step - loss: 0.0901 - acc: 0.9724 - val_loss: 0.7794 - val_acc: 0.7828
Epoch 5/10
1159/1159 [==============================] - 160s 138ms/step - loss: 0.0692 - acc: 0.9819 - val_loss: 0.7278 - val_acc: 0.8414
Epoch 6/10
1159/1159 [==============================] - 116s 100ms/step - loss: 0.0726 - acc: 0.9767 - val_loss: 0.6092 - val_acc: 0.8276
Epoch 7/10
1159/1159 [==============================] - 131s 113ms/step - loss: 0.0497 - acc: 0.9836 - val_loss: 0.6462 - val_acc: 0.8310
Epoch 8/10
1159/1159 [==============================] - 127s 110ms/step - loss: 0.0260 - acc: 0.9922 - val_loss: 0.6983 - val_acc: 0.8138
Epoch 9/10
1159/1159 [==============================] - 114s 98ms/step - loss: 0.0288 - acc: 0.9922 - val_loss: 0.8115 - val_acc: 0.8345
Epoch 10/10
1159/1159 [==============================] - 112s 97ms/step - loss: 0.0183 - acc: 0.9922 - val_loss: 0.8975 - val_acc: 0.8172
290/290 [==============================] - 6s 21ms/step
Test score: 0.8974992581225675
Test accuracy: 0.8172413793103448
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])

In [121]:
# Hierachical LSTM
# https://github.com/richliao/textClassifier/blob/master/textClassifierHATT.py

MAX_SENTS = 30
sentence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
sentEncoder = Model(sentence_input, l_lstm)

review_input = Input(shape=(MAX_SENTS, MAX_SEQUENCE_LENGTH), dtype='int32')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(LSTM(100))(review_encoder)
preds = Dense(2, activation='softmax')(l_lstm_sent)
model = Model(review_input, preds)

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print("model fitting - Hierachical LSTM")
print (model.summary())

network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs,
                    verbose=1,
                    validation_split=0.2)


score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)

print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


model fitting - Hierachical LSTM
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_52 (InputLayer)        (None, 30, 500)           0         
_________________________________________________________________
time_distributed_28 (TimeDis (None, 30, 200)           768600    
_________________________________________________________________
bidirectional_30 (Bidirectio (None, 200)               240800    
_________________________________________________________________
dense_105 (Dense)            (None, 2)                 402       
=================================================================
Total params: 1,009,802
Trainable params: 1,009,802
Non-trainable params: 0
_________________________________________________________________
None
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-121-64c296a0e02f> in <module>()
     27                     epochs=epochs,
     28                     verbose=1,
---> 29                     validation_split=0.2)
     30 
     31 

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
   1579             class_weight=class_weight,
   1580             check_batch_axis=False,
-> 1581             batch_size=batch_size)
   1582         # Prepare validation data.
   1583         do_validation = False

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
   1412                                     self._feed_input_shapes,
   1413                                     check_batch_axis=False,
-> 1414                                     exception_prefix='input')
   1415         y = _standardize_input_data(y, self._feed_output_names,
   1416                                     output_shapes,

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    139                                  ' to have ' + str(len(shapes[i])) +
    140                                  ' dimensions, but got array with shape ' +
--> 141                                  str(array.shape))
    142             for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])):
    143                 if not j and not check_batch_axis:

ValueError: Error when checking input: expected input_52 to have 3 dimensions, but got array with shape (1159, 500)

In [118]:
# https://github.com/richliao/textClassifier/blob/master/textClassifierHATT.py

from keras.engine.topology import Layer, InputSpec
from keras import initializers
from keras import backend as K

# building Hierachical Attention network - 2nd part
embedding_matrix = np.random.random((len(word_index) + 1, EMBEDDING_DIM))
for word, i in word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector
        
embedding_layer = Embedding(len(word_index) + 1,
                            EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=MAX_SEQUENCE_LENGTH,
                            trainable=True)

class AttLayer(Layer):
    def __init__(self, **kwargs):
        self.init = initializers.get('normal')
        #self.input_spec = [InputSpec(ndim=3)]
        super(AttLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape)==3
        #self.W = self.init((input_shape[-1],1))
        self.W = self.init((input_shape[-1],))
        #self.input_spec = [InputSpec(shape=input_shape)]
        self.trainable_weights = [self.W]
        super(AttLayer, self).build(input_shape)  # be sure you call this somewhere!

    def call(self, x, mask=None):
        eij = K.tanh(K.dot(x, self.W))
        
        ai = K.exp(eij)
        weights = ai/K.sum(ai, axis=1).dimshuffle(0,'x')
        
        weighted_input = x*weights.dimshuffle(0,1,'x')
        return weighted_input.sum(axis=1)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], input_shape[-1])


sentence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(GRU(100, return_sequences=True))(embedded_sequences)
l_dense = TimeDistributed(Dense(200))(l_lstm)
l_att = AttLayer()(l_dense)
sentEncoder = Model(sentence_input, l_att)

review_input = Input(shape=(MAX_SENTS, MAX_SEQUENCE_LENGTH), dtype='int32')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(GRU(100, return_sequences=True))(review_encoder)
l_dense_sent = TimeDistributed(Dense(200))(l_lstm_sent)
l_att_sent = AttLayer()(l_dense_sent)
preds = Dense(2, activation='softmax')(l_att_sent)
model = Model(review_input, preds)

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print(model.summary())

print("model fitting - Hierachical attention network")

network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs,
                    verbose=1,
                    validation_split=0.2)

score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)

print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_48 (InputLayer)        (None, 30, 500)           0         
_________________________________________________________________
time_distributed_26 (TimeDis (None, 30, 200)           768800    
_________________________________________________________________
bidirectional_26 (Bidirectio (None, 30, 200)           180600    
_________________________________________________________________
time_distributed_27 (TimeDis (None, 30, 200)           40200     
_________________________________________________________________
att_layer_12 (AttLayer)      (None, 200)               200       
_________________________________________________________________
dense_102 (Dense)            (None, 2)                 402       
=================================================================
Total params: 990,202
Trainable params: 990,202
Non-trainable params: 0
_________________________________________________________________
None
model fitting - Hierachical attention network
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-118-4389b318a258> in <module>()
     75                     epochs=epochs,
     76                     verbose=1,
---> 77                     validation_split=0.2)
     78 
     79 score = model.evaluate(x_test, y_test,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
   1579             class_weight=class_weight,
   1580             check_batch_axis=False,
-> 1581             batch_size=batch_size)
   1582         # Prepare validation data.
   1583         do_validation = False

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
   1412                                     self._feed_input_shapes,
   1413                                     check_batch_axis=False,
-> 1414                                     exception_prefix='input')
   1415         y = _standardize_input_data(y, self._feed_output_names,
   1416                                     output_shapes,

/usr/local/lib/python3.5/dist-packages/keras/engine/training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    139                                  ' to have ' + str(len(shapes[i])) +
    140                                  ' dimensions, but got array with shape ' +
--> 141                                  str(array.shape))
    142             for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])):
    143                 if not j and not check_batch_axis:

ValueError: Error when checking input: expected input_48 to have 3 dimensions, but got array with shape (1159, 500)

In [58]:
%%time

# Very hopefull... work on this
# https://github.com/keras-team/keras/blob/master/examples/pretrained_word_embeddings.py
epochs=20

# train a 1D convnet with global maxpooling
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
x = Conv1D(64, 5, activation='relu')(embedded_sequences)
x = MaxPooling1D(5)(x)
x = Conv1D(64, 5, activation='relu')(x)
x = MaxPooling1D(5)(x)
x = Conv1D(64, 5, activation='relu')(x)
x = GlobalMaxPooling1D()(x)
x = Dense(64, activation='relu')(x)
preds = Dense(num_classes, activation='softmax')(x)

model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print(model.summary())


network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs,
                    verbose=1,
                    validation_split=0.2)

score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)

print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_11 (InputLayer)        (None, 500)               0         
_________________________________________________________________
embedding_26 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
conv1d_40 (Conv1D)           (None, 496, 64)           32064     
_________________________________________________________________
max_pooling1d_18 (MaxPooling (None, 99, 64)            0         
_________________________________________________________________
conv1d_41 (Conv1D)           (None, 95, 64)            20544     
_________________________________________________________________
max_pooling1d_19 (MaxPooling (None, 19, 64)            0         
_________________________________________________________________
conv1d_42 (Conv1D)           (None, 15, 64)            20544     
_________________________________________________________________
global_max_pooling1d_12 (Glo (None, 64)                0         
_________________________________________________________________
dense_46 (Dense)             (None, 64)                4160      
_________________________________________________________________
dense_47 (Dense)             (None, 3)                 195       
=================================================================
Total params: 685,307
Trainable params: 77,507
Non-trainable params: 607,800
_________________________________________________________________
None
Train on 1159 samples, validate on 290 samples
Epoch 1/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.6546 - acc: 0.7239 - val_loss: 0.4663 - val_acc: 0.8000
Epoch 2/20
1159/1159 [==============================] - 13s 11ms/step - loss: 0.4400 - acc: 0.8395 - val_loss: 0.4900 - val_acc: 0.8414
Epoch 3/20
1159/1159 [==============================] - 13s 12ms/step - loss: 0.3433 - acc: 0.8758 - val_loss: 0.5529 - val_acc: 0.8241
Epoch 4/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.2491 - acc: 0.9094 - val_loss: 0.5559 - val_acc: 0.8276
Epoch 5/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.1619 - acc: 0.9474 - val_loss: 0.6207 - val_acc: 0.8345
Epoch 6/20
1159/1159 [==============================] - 18s 16ms/step - loss: 0.0910 - acc: 0.9655 - val_loss: 0.7205 - val_acc: 0.8276
Epoch 7/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0580 - acc: 0.9819 - val_loss: 0.7845 - val_acc: 0.8276
Epoch 8/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0334 - acc: 0.9888 - val_loss: 1.0043 - val_acc: 0.8483
Epoch 9/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0321 - acc: 0.9905 - val_loss: 1.0421 - val_acc: 0.8241
Epoch 10/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0217 - acc: 0.9931 - val_loss: 1.1618 - val_acc: 0.8379
Epoch 11/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0073 - acc: 0.9974 - val_loss: 1.0975 - val_acc: 0.8379
Epoch 12/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0239 - acc: 0.9948 - val_loss: 1.2515 - val_acc: 0.8517
Epoch 13/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.0545 - acc: 0.9879 - val_loss: 1.0451 - val_acc: 0.8310
Epoch 14/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0100 - acc: 0.9974 - val_loss: 1.3065 - val_acc: 0.8276
Epoch 15/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0072 - acc: 0.9974 - val_loss: 1.4463 - val_acc: 0.8379
Epoch 16/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.0423 - acc: 0.9940 - val_loss: 1.4254 - val_acc: 0.8310
Epoch 17/20
1159/1159 [==============================] - 18s 15ms/step - loss: 0.0010 - acc: 1.0000 - val_loss: 1.5783 - val_acc: 0.8310
Epoch 18/20
1159/1159 [==============================] - 16s 14ms/step - loss: 0.0258 - acc: 0.9940 - val_loss: 1.5583 - val_acc: 0.8345
Epoch 19/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0308 - acc: 0.9931 - val_loss: 1.4104 - val_acc: 0.8414
Epoch 20/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0264 - acc: 0.9957 - val_loss: 1.5980 - val_acc: 0.8379
290/290 [==============================] - 1s 5ms/step
Test score: 1.5979832925618995
Test accuracy: 0.8379310287278274
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])

In [69]:
%%time

# https://github.com/Theo-/sentiment-analysis-keras-conv/blob/master/train_keras.py
model = Sequential()
model.add(Embedding(len(word_index) + 1, 
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=MAX_SEQUENCE_LENGTH,
                    trainable=False))

# Convolutional model (3x conv, flatten, 2x dense)
model.add(Convolution1D(64, 3, padding='same'))
model.add(Convolution1D(32, 3, padding='same'))
model.add(Convolution1D(16, 3, padding='same'))
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(180, activation='sigmoid'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='sigmoid'))


model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print(model.summary())


network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs, verbose=1,
                    validation_split=0.2)

score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)

print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_32 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
conv1d_52 (Conv1D)           (None, 500, 64)           19264     
_________________________________________________________________
conv1d_53 (Conv1D)           (None, 500, 32)           6176      
_________________________________________________________________
conv1d_54 (Conv1D)           (None, 500, 16)           1552      
_________________________________________________________________
flatten_7 (Flatten)          (None, 8000)              0         
_________________________________________________________________
dropout_30 (Dropout)         (None, 8000)              0         
_________________________________________________________________
dense_54 (Dense)             (None, 180)               1440180   
_________________________________________________________________
dropout_31 (Dropout)         (None, 180)               0         
_________________________________________________________________
dense_55 (Dense)             (None, 3)                 543       
=================================================================
Total params: 2,075,515
Trainable params: 1,467,715
Non-trainable params: 607,800
_________________________________________________________________
None
Train on 1159 samples, validate on 290 samples
Epoch 1/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.6539 - acc: 0.7334 - val_loss: 0.5635 - val_acc: 0.7793
Epoch 2/20
1159/1159 [==============================] - 16s 14ms/step - loss: 0.4974 - acc: 0.8076 - val_loss: 0.5947 - val_acc: 0.7621
Epoch 3/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.4044 - acc: 0.8318 - val_loss: 0.5476 - val_acc: 0.8172
Epoch 4/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.3134 - acc: 0.8714 - val_loss: 0.5427 - val_acc: 0.8138
Epoch 5/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.2572 - acc: 0.8991 - val_loss: 0.6416 - val_acc: 0.7897
Epoch 6/20
1159/1159 [==============================] - 16s 14ms/step - loss: 0.2108 - acc: 0.9154 - val_loss: 0.7553 - val_acc: 0.8069
Epoch 7/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.1559 - acc: 0.9422 - val_loss: 0.7570 - val_acc: 0.7966
Epoch 8/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.1456 - acc: 0.9396 - val_loss: 0.7888 - val_acc: 0.8000
Epoch 9/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.1071 - acc: 0.9560 - val_loss: 0.9298 - val_acc: 0.7828
Epoch 10/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0888 - acc: 0.9646 - val_loss: 0.8507 - val_acc: 0.8172
Epoch 11/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.0817 - acc: 0.9681 - val_loss: 0.8495 - val_acc: 0.8069
Epoch 12/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0696 - acc: 0.9733 - val_loss: 1.0875 - val_acc: 0.7931
Epoch 13/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.0545 - acc: 0.9827 - val_loss: 1.0359 - val_acc: 0.8000
Epoch 14/20
1159/1159 [==============================] - 15s 13ms/step - loss: 0.0629 - acc: 0.9776 - val_loss: 1.0564 - val_acc: 0.7966
Epoch 15/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0529 - acc: 0.9802 - val_loss: 1.0641 - val_acc: 0.8034
Epoch 16/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0615 - acc: 0.9802 - val_loss: 1.2014 - val_acc: 0.7828
Epoch 17/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0407 - acc: 0.9836 - val_loss: 1.1213 - val_acc: 0.8069
Epoch 18/20
1159/1159 [==============================] - 16s 14ms/step - loss: 0.0370 - acc: 0.9871 - val_loss: 1.1511 - val_acc: 0.7897
Epoch 19/20
1159/1159 [==============================] - 14s 12ms/step - loss: 0.0270 - acc: 0.9896 - val_loss: 1.2126 - val_acc: 0.8000
Epoch 20/20
1159/1159 [==============================] - 17s 14ms/step - loss: 0.0322 - acc: 0.9845 - val_loss: 1.2536 - val_acc: 0.8034
290/290 [==============================] - 2s 6ms/step
Test score: 1.253567595388098
Test accuracy: 0.8034482721624703
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])
CPU times: user 8min 37s, sys: 9min 10s, total: 17min 47s
Wall time: 5min

In [45]:
%%time

# not learning anything
# doesnt get better than random guess

batch_size = 10
epochs = 30

print('Building model...')
model = Sequential()


model.add(Dense(128, input_shape=(x_train.shape[1],)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

print(model.summary())

network_hist = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs,
                    verbose=1,
                    validation_split=0.2)

score = model.evaluate(x_test, y_test,
                       batch_size=batch_size, verbose=1)


print('Test score:', score[0])
print('Test accuracy:', score[1])

plot_history(network_hist)


Building model...
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_34 (Dense)             (None, 128)               128128    
_________________________________________________________________
activation_14 (Activation)   (None, 128)               0         
_________________________________________________________________
dropout_15 (Dropout)         (None, 128)               0         
_________________________________________________________________
dense_35 (Dense)             (None, 3)                 387       
_________________________________________________________________
activation_15 (Activation)   (None, 3)                 0         
=================================================================
Total params: 128,515
Trainable params: 128,515
Non-trainable params: 0
_________________________________________________________________
None
Train on 1159 samples, validate on 290 samples
Epoch 1/50
1159/1159 [==============================] - 1s 467us/step - loss: 10.0229 - acc: 0.3727 - val_loss: 9.2656 - val_acc: 0.4207
Epoch 2/50
1159/1159 [==============================] - 0s 423us/step - loss: 9.9770 - acc: 0.3788 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 3/50
1159/1159 [==============================] - 0s 420us/step - loss: 9.7905 - acc: 0.3926 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 4/50
1159/1159 [==============================] - 1s 468us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 5/50
1159/1159 [==============================] - 0s 411us/step - loss: 9.7626 - acc: 0.3943 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 6/50
1159/1159 [==============================] - 0s 419us/step - loss: 9.7770 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 7/50
1159/1159 [==============================] - 1s 508us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 8/50
1159/1159 [==============================] - 1s 689us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 9/50
1159/1159 [==============================] - 1s 606us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 10/50
1159/1159 [==============================] - 1s 498us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 11/50
1159/1159 [==============================] - 1s 521us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 12/50
1159/1159 [==============================] - 1s 615us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 13/50
1159/1159 [==============================] - 1s 439us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 14/50
1159/1159 [==============================] - 1s 561us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 15/50
1159/1159 [==============================] - 1s 473us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 16/50
1159/1159 [==============================] - 1s 656us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 17/50
1159/1159 [==============================] - 1s 651us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 18/50
1159/1159 [==============================] - 1s 479us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 19/50
1159/1159 [==============================] - 1s 493us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 20/50
1159/1159 [==============================] - 0s 367us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 21/50
1159/1159 [==============================] - 1s 498us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 22/50
1159/1159 [==============================] - 1s 459us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 23/50
1159/1159 [==============================] - 1s 449us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 24/50
1159/1159 [==============================] - 1s 502us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 25/50
1159/1159 [==============================] - 1s 538us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 26/50
1159/1159 [==============================] - 1s 471us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 27/50
1159/1159 [==============================] - 1s 495us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 28/50
1159/1159 [==============================] - 1s 530us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 29/50
1159/1159 [==============================] - 1s 522us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 30/50
1159/1159 [==============================] - 0s 412us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 31/50
1159/1159 [==============================] - 1s 531us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 32/50
1159/1159 [==============================] - 1s 461us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 33/50
1159/1159 [==============================] - 1s 509us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 34/50
1159/1159 [==============================] - 1s 459us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 35/50
1159/1159 [==============================] - 1s 496us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 36/50
1159/1159 [==============================] - 1s 442us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 37/50
1159/1159 [==============================] - 1s 504us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 38/50
1159/1159 [==============================] - 1s 466us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 39/50
1159/1159 [==============================] - 1s 499us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 40/50
1159/1159 [==============================] - 1s 472us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 41/50
1159/1159 [==============================] - 1s 449us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 42/50
1159/1159 [==============================] - 1s 551us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 43/50
1159/1159 [==============================] - 1s 517us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 44/50
1159/1159 [==============================] - 1s 660us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 45/50
1159/1159 [==============================] - 1s 728us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 46/50
1159/1159 [==============================] - 1s 538us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 47/50
1159/1159 [==============================] - 1s 527us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 48/50
1159/1159 [==============================] - 1s 623us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 49/50
1159/1159 [==============================] - 1s 628us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
Epoch 50/50
1159/1159 [==============================] - 1s 512us/step - loss: 9.7765 - acc: 0.3934 - val_loss: 9.5041 - val_acc: 0.4103
290/290 [==============================] - 0s 58us/step
Test score: 9.5041184425354
Test accuracy: 0.4103448357561539
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])
CPU times: user 38.4 s, sys: 55.9 s, total: 1min 34s
Wall time: 31.2 s

In [125]:
%%time

# https://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py

epochs = 5

print('Build LSTM model...')
model = Sequential()
model.add(Embedding(len(word_index) + 1, 
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=MAX_SEQUENCE_LENGTH,
                    trainable=False))
model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(num_classes, activation='sigmoid'))

# try using different optimizers and different optimizer configs
adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

model.compile(loss='categorical_crossentropy',
              optimizer='RMSprop',
              metrics=['accuracy'])

print(model.summary())

print('Train...')
network_hist = model.fit(x_train, y_train, 
                         batch_size=batch_size, epochs=epochs,
                         verbose=1, validation_data=(x_test, y_test),
                         validation_split=0.2)


score, acc = model.evaluate(x_test, y_test,
                            batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


Build LSTM model...
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_67 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
lstm_24 (LSTM)               (None, 64)                42240     
_________________________________________________________________
dense_109 (Dense)            (None, 3)                 195       
=================================================================
Total params: 650,235
Trainable params: 42,435
Non-trainable params: 607,800
_________________________________________________________________
None
Train...
Train on 1159 samples, validate on 290 samples
Epoch 1/5
1159/1159 [==============================] - 137s 118ms/step - loss: 0.8352 - acc: 0.6471 - val_loss: 0.6160 - val_acc: 0.7621
Epoch 2/5
1159/1159 [==============================] - 136s 117ms/step - loss: 0.5929 - acc: 0.7748 - val_loss: 0.8153 - val_acc: 0.6483
Epoch 3/5
1159/1159 [==============================] - 137s 118ms/step - loss: 0.5288 - acc: 0.7921 - val_loss: 0.6019 - val_acc: 0.7897
Epoch 4/5
1159/1159 [==============================] - 138s 119ms/step - loss: 0.5045 - acc: 0.7981 - val_loss: 0.5547 - val_acc: 0.8000
Epoch 5/5
1159/1159 [==============================] - 141s 122ms/step - loss: 0.4560 - acc: 0.8318 - val_loss: 0.5908 - val_acc: 0.7517
290/290 [==============================] - 12s 40ms/step
Test score: 0.5908143109288709
Test accuracy: 0.7517241379310344
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])
CPU times: user 10min 54s, sys: 1min 5s, total: 12min
Wall time: 11min 59s

In [50]:
%%time

# https://github.com/keras-team/keras/blob/master/examples/imdb_cnn.py

# set parameters:
batch_size = 32
embedding_dims = 100
filters = 64
kernel_size = 3
hidden_dims = 64
epochs = 10


print('Build model...')
model = Sequential()

# we start off with an efficient embedding layer which maps
# our vocab indices into embedding_dims dimensions
model.add(Embedding(len(word_index) + 1, 
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=MAX_SEQUENCE_LENGTH,
                    trainable=False))
model.add(Dropout(0.2))

# we add a Convolution1D, which will learn filters
# word group filters of size filter_length:
model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1))
# we use max pooling:
model.add(GlobalMaxPooling1D())

# We add a vanilla hidden layer:
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))

# We project onto a single unit output layer, and squash it with a sigmoid:
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

model.compile(loss='categorical_crossentropy',
              optimizer='RMSprop',
              metrics=['accuracy'])

print(model.summary())


print('Training...')
network_hist = model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs, validation_split=0.2,
          validation_data=(x_test, y_test))


score, acc = model.evaluate(x_test, y_test,
                            batch_size=batch_size)

print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


Build model...
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_23 (Embedding)     (None, 1000, 100)         607800    
_________________________________________________________________
dropout_20 (Dropout)         (None, 1000, 100)         0         
_________________________________________________________________
conv1d_37 (Conv1D)           (None, 998, 64)           19264     
_________________________________________________________________
global_max_pooling1d_11 (Glo (None, 64)                0         
_________________________________________________________________
dense_42 (Dense)             (None, 128)               8320      
_________________________________________________________________
dropout_21 (Dropout)         (None, 128)               0         
_________________________________________________________________
activation_20 (Activation)   (None, 128)               0         
_________________________________________________________________
dense_43 (Dense)             (None, 3)                 387       
_________________________________________________________________
activation_21 (Activation)   (None, 3)                 0         
=================================================================
Total params: 635,771
Trainable params: 27,971
Non-trainable params: 607,800
_________________________________________________________________
None
Training...
Train on 1159 samples, validate on 290 samples
Epoch 1/10
1159/1159 [==============================] - 15s 13ms/step - loss: 0.8954 - acc: 0.5617 - val_loss: 0.6878 - val_acc: 0.7103
Epoch 2/10
1159/1159 [==============================] - 14s 12ms/step - loss: 0.6510 - acc: 0.7222 - val_loss: 0.6815 - val_acc: 0.6862
Epoch 3/10
1159/1159 [==============================] - 14s 12ms/step - loss: 0.5483 - acc: 0.7860 - val_loss: 0.5339 - val_acc: 0.7828
Epoch 4/10
1159/1159 [==============================] - 15s 13ms/step - loss: 0.4863 - acc: 0.8041 - val_loss: 0.5014 - val_acc: 0.8000
Epoch 5/10
1159/1159 [==============================] - 14s 12ms/step - loss: 0.4519 - acc: 0.8283 - val_loss: 0.5390 - val_acc: 0.8000
Epoch 6/10
1159/1159 [==============================] - 15s 13ms/step - loss: 0.4120 - acc: 0.8499 - val_loss: 0.6598 - val_acc: 0.7379
Epoch 7/10
1159/1159 [==============================] - 13s 11ms/step - loss: 0.4038 - acc: 0.8404 - val_loss: 0.5366 - val_acc: 0.7724
Epoch 8/10
1159/1159 [==============================] - 13s 11ms/step - loss: 0.3869 - acc: 0.8611 - val_loss: 0.6011 - val_acc: 0.7517
Epoch 9/10
1159/1159 [==============================] - 13s 11ms/step - loss: 0.3393 - acc: 0.8775 - val_loss: 0.5366 - val_acc: 0.7931
Epoch 10/10
1159/1159 [==============================] - 13s 11ms/step - loss: 0.3152 - acc: 0.8852 - val_loss: 0.6396 - val_acc: 0.7448
290/290 [==============================] - 2s 7ms/step
Test score: 0.6396226323884109
Test accuracy: 0.7448275862068966
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])
CPU times: user 4min 11s, sys: 3min 55s, total: 8min 7s
Wall time: 2min 21s

In [52]:
%%time

# https://github.com/keras-team/keras/blob/master/examples/imdb_cnn_lstm.py

# Convolution
kernel_size = 5
filters = 64
pool_size = 4

# LSTM
lstm_output_size = 70

# Training
batch_size = 10
epochs = 10

print('Build model...')

model = Sequential()
model.add(Embedding(len(word_index) + 1, 
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=MAX_SEQUENCE_LENGTH,
                    trainable=False))

model.add(Dropout(0.2))

model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1))

model.add(MaxPooling1D(pool_size=pool_size))
model.add(LSTM(lstm_output_size))

model.add(Dense(num_classes))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

model.compile(loss='categorical_crossentropy',
              optimizer='RMSprop',
              metrics=['accuracy'])

print(model.summary())

print('Train...')
network_hist = model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs, validation_split=0.2,
          validation_data=(x_test, y_test))

score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


Build model...
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_25 (Embedding)     (None, 1000, 100)         607800    
_________________________________________________________________
dropout_23 (Dropout)         (None, 1000, 100)         0         
_________________________________________________________________
conv1d_39 (Conv1D)           (None, 996, 64)           32064     
_________________________________________________________________
max_pooling1d_17 (MaxPooling (None, 249, 64)           0         
_________________________________________________________________
lstm_6 (LSTM)                (None, 70)                37800     
_________________________________________________________________
dense_45 (Dense)             (None, 3)                 213       
_________________________________________________________________
activation_23 (Activation)   (None, 3)                 0         
=================================================================
Total params: 677,877
Trainable params: 70,077
Non-trainable params: 607,800
_________________________________________________________________
None
Train...
Train on 1159 samples, validate on 290 samples
Epoch 1/10
1159/1159 [==============================] - 48s 42ms/step - loss: 0.7118 - acc: 0.6851 - val_loss: 0.5947 - val_acc: 0.7655
Epoch 2/10
1159/1159 [==============================] - 48s 41ms/step - loss: 0.5153 - acc: 0.7929 - val_loss: 0.5930 - val_acc: 0.7690
Epoch 3/10
1159/1159 [==============================] - 50s 43ms/step - loss: 0.4655 - acc: 0.8283 - val_loss: 0.4521 - val_acc: 0.8448
Epoch 4/10
 600/1159 [==============>...............] - ETA: 19s - loss: 0.4205 - acc: 0.8417
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<timed exec> in <module>()

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
    958                               initial_epoch=initial_epoch,
    959                               steps_per_epoch=steps_per_epoch,
--> 960                               validation_steps=validation_steps)
    961 
    962     def evaluate(self, x, y, batch_size=32, verbose=1,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
   1655                               initial_epoch=initial_epoch,
   1656                               steps_per_epoch=steps_per_epoch,
-> 1657                               validation_steps=validation_steps)
   1658 
   1659     def evaluate(self, x=None, y=None,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps)
   1211                     batch_logs['size'] = len(batch_ids)
   1212                     callbacks.on_batch_begin(batch_index, batch_logs)
-> 1213                     outs = f(ins_batch)
   1214                     if not isinstance(outs, list):
   1215                         outs = [outs]

/usr/local/lib/python3.5/dist-packages/keras/backend/theano_backend.py in __call__(self, inputs)
   1222     def __call__(self, inputs):
   1223         assert isinstance(inputs, (list, tuple))
-> 1224         return self.function(*inputs)
   1225 
   1226 

/usr/local/lib/python3.5/dist-packages/theano/compile/function_module.py in __call__(self, *args, **kwargs)
    901         try:
    902             outputs =\
--> 903                 self.fn() if output_subset is None else\
    904                 self.fn(output_subset=output_subset)
    905         except Exception:

/usr/local/lib/python3.5/dist-packages/theano/gof/op.py in rval(p, i, o, n)
    889         if params is graph.NoParams:
    890             # default arguments are stored in the closure of `rval`
--> 891             def rval(p=p, i=node_input_storage, o=node_output_storage, n=node):
    892                 r = p(n, [x[0] for x in i], o)
    893                 for o in node.outputs:

KeyboardInterrupt: 

In [70]:
%%time

# https://github.com/bhaveshoswal/CNN-text-classification-keras/blob/master/model.py

vocabulary_size = len(word_index) # 18765
# embedding_dim = 100
filter_sizes = [3,4,5]
num_filters = 512
drop = 0.5

epochs = 20
batch_size = 30

# this returns a tensor
print("Creating Model...")
inputs = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedding = Embedding(len(word_index) + 1,
                        EMBEDDING_DIM,
                        weights=[embedding_matrix],
                        input_length=MAX_SEQUENCE_LENGTH,
                        trainable=False)(inputs)
# Embedding(input_dim=vocabulary_size, output_dim=embedding_dim, input_length=sequence_length)

reshape = Reshape((MAX_SEQUENCE_LENGTH, EMBEDDING_DIM, 1))(embedding)

conv_0 = Conv2D(num_filters, kernel_size=(filter_sizes[0], EMBEDDING_DIM), 
                padding='valid', kernel_initializer='normal', activation='relu')(reshape)
conv_1 = Conv2D(num_filters, kernel_size=(filter_sizes[1], EMBEDDING_DIM), 
                padding='valid', kernel_initializer='normal', activation='relu')(reshape)
conv_2 = Conv2D(num_filters, kernel_size=(filter_sizes[2], EMBEDDING_DIM), 
                padding='valid', kernel_initializer='normal', activation='relu')(reshape)

maxpool_0 = MaxPool2D(pool_size=(sequence_length - filter_sizes[0] + 1, 1), 
                      strides=(1,1), padding='valid')(conv_0)
maxpool_1 = MaxPool2D(pool_size=(sequence_length - filter_sizes[1] + 1, 1), 
                      strides=(1,1), padding='valid')(conv_1)
maxpool_2 = MaxPool2D(pool_size=(sequence_length - filter_sizes[2] + 1, 1), 
                      strides=(1,1), padding='valid')(conv_2)

concatenated_tensor = Concatenate(axis=1)([maxpool_0, maxpool_1, maxpool_2])
flatten = Flatten()(concatenated_tensor)
dropout = Dropout(drop)(flatten)
output = Dense(units=num_classes, activation='softmax')(dropout)

# this creates a model that includes
model = Model(inputs=inputs, outputs=output)

checkpoint = ModelCheckpoint('weights.{epoch:03d}-{val_acc:.4f}.hdf5', 
                             monitor='val_acc', verbose=1, save_best_only=True, mode='auto')

adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

model.compile(optimizer=adam, 
              loss='categorical_crossentropy',
              metrics=['accuracy'])

print(model.summary())

print("Traning Model...")
network_hist = model.fit(x_train, y_train, batch_size=batch_size, 
          epochs=epochs, verbose=1, callbacks=[checkpoint], 
          validation_data=(x_test, y_test))  # starts training


score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


Creating Model...
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_15 (InputLayer)           (None, 500)          0                                            
__________________________________________________________________________________________________
embedding_33 (Embedding)        (None, 500, 100)     607800      input_15[0][0]                   
__________________________________________________________________________________________________
reshape_2 (Reshape)             (None, 500, 100, 1)  0           embedding_33[0][0]               
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 498, 1, 512)  154112      reshape_2[0][0]                  
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 497, 1, 512)  205312      reshape_2[0][0]                  
__________________________________________________________________________________________________
conv2d_6 (Conv2D)               (None, 496, 1, 512)  256512      reshape_2[0][0]                  
__________________________________________________________________________________________________
max_pooling2d_4 (MaxPooling2D)  (None, 401, 1, 512)  0           conv2d_4[0][0]                   
__________________________________________________________________________________________________
max_pooling2d_5 (MaxPooling2D)  (None, 401, 1, 512)  0           conv2d_5[0][0]                   
__________________________________________________________________________________________________
max_pooling2d_6 (MaxPooling2D)  (None, 401, 1, 512)  0           conv2d_6[0][0]                   
__________________________________________________________________________________________________
concatenate_2 (Concatenate)     (None, 1203, 1, 512) 0           max_pooling2d_4[0][0]            
                                                                 max_pooling2d_5[0][0]            
                                                                 max_pooling2d_6[0][0]            
__________________________________________________________________________________________________
flatten_8 (Flatten)             (None, 615936)       0           concatenate_2[0][0]              
__________________________________________________________________________________________________
dropout_32 (Dropout)            (None, 615936)       0           flatten_8[0][0]                  
__________________________________________________________________________________________________
dense_56 (Dense)                (None, 3)            1847811     dropout_32[0][0]                 
==================================================================================================
Total params: 3,071,547
Trainable params: 2,463,747
Non-trainable params: 607,800
__________________________________________________________________________________________________
None
Traning Model...
Train on 1159 samples, validate on 290 samples
Epoch 1/20
 240/1159 [=====>........................] - ETA: 7:27 - loss: 1.3138 - acc: 0.3792
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<timed exec> in <module>()

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
   1655                               initial_epoch=initial_epoch,
   1656                               steps_per_epoch=steps_per_epoch,
-> 1657                               validation_steps=validation_steps)
   1658 
   1659     def evaluate(self, x=None, y=None,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps)
   1211                     batch_logs['size'] = len(batch_ids)
   1212                     callbacks.on_batch_begin(batch_index, batch_logs)
-> 1213                     outs = f(ins_batch)
   1214                     if not isinstance(outs, list):
   1215                         outs = [outs]

/usr/local/lib/python3.5/dist-packages/keras/backend/theano_backend.py in __call__(self, inputs)
   1222     def __call__(self, inputs):
   1223         assert isinstance(inputs, (list, tuple))
-> 1224         return self.function(*inputs)
   1225 
   1226 

/usr/local/lib/python3.5/dist-packages/theano/compile/function_module.py in __call__(self, *args, **kwargs)
    901         try:
    902             outputs =\
--> 903                 self.fn() if output_subset is None else\
    904                 self.fn(output_subset=output_subset)
    905         except Exception:

/usr/local/lib/python3.5/dist-packages/theano/ifelse.py in thunk()
    243         outputs = node.outputs
    244 
--> 245         def thunk():
    246             if not compute_map[cond][0]:
    247                 return [0]

KeyboardInterrupt: 

In [71]:
# Keras convolutional model
batch_size = 32
epochs = 20


model = Sequential()
model.add(Embedding(len(word_index) + 1,
                        EMBEDDING_DIM,
                        weights=[embedding_matrix],
                        input_length=MAX_SEQUENCE_LENGTH,
                        trainable=False))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Dropout(0.25))

model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Dropout(0.25))

model.add(Flatten())

# model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='sigmoid'))
model.add(Dropout(0.5))


model.add(Dense(units=num_classes, activation='softmax'))

adam = Adam(lr=0.0001, decay=1e-6)

# Compile the model
model.compile(loss='categorical_crossentropy',
              optimizer=adam,
              metrics=['accuracy'])

print(model.summary())

print('Training...')
# Fit the model
network_hist = model.fit(x_train, y_train,
          batch_size=batch_size,
          shuffle=True,
          epochs=epochs,
          validation_data=(x_test, y_test),
          callbacks=[EarlyStopping(min_delta=0.00025, patience=2)])


score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_34 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
conv1d_55 (Conv1D)           (None, 500, 32)           9632      
_________________________________________________________________
conv1d_56 (Conv1D)           (None, 500, 32)           3104      
_________________________________________________________________
conv1d_57 (Conv1D)           (None, 500, 32)           3104      
_________________________________________________________________
conv1d_58 (Conv1D)           (None, 500, 32)           3104      
_________________________________________________________________
dropout_33 (Dropout)         (None, 500, 32)           0         
_________________________________________________________________
conv1d_59 (Conv1D)           (None, 500, 32)           2080      
_________________________________________________________________
conv1d_60 (Conv1D)           (None, 500, 32)           2080      
_________________________________________________________________
conv1d_61 (Conv1D)           (None, 500, 32)           2080      
_________________________________________________________________
conv1d_62 (Conv1D)           (None, 500, 32)           2080      
_________________________________________________________________
dropout_34 (Dropout)         (None, 500, 32)           0         
_________________________________________________________________
flatten_9 (Flatten)          (None, 16000)             0         
_________________________________________________________________
dense_57 (Dense)             (None, 256)               4096256   
_________________________________________________________________
dropout_35 (Dropout)         (None, 256)               0         
_________________________________________________________________
dense_58 (Dense)             (None, 3)                 771       
=================================================================
Total params: 4,732,091
Trainable params: 4,124,291
Non-trainable params: 607,800
_________________________________________________________________
None
Training...
Train on 1159 samples, validate on 290 samples
Epoch 1/20
1159/1159 [==============================] - 31s 27ms/step - loss: 1.1751 - acc: 0.3814 - val_loss: 0.9716 - val_acc: 0.5414
Epoch 2/20
1159/1159 [==============================] - 30s 26ms/step - loss: 0.9419 - acc: 0.5427 - val_loss: 0.6694 - val_acc: 0.7345
Epoch 3/20
1159/1159 [==============================] - 29s 25ms/step - loss: 0.6946 - acc: 0.6721 - val_loss: 0.5476 - val_acc: 0.7655
Epoch 4/20
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-71-b77eaf7249f4> in <module>()
     47           epochs=epochs,
     48           validation_data=(x_test, y_test),
---> 49           callbacks=[EarlyStopping(min_delta=0.00025, patience=2)])
     50 
     51 

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
    958                               initial_epoch=initial_epoch,
    959                               steps_per_epoch=steps_per_epoch,
--> 960                               validation_steps=validation_steps)
    961 
    962     def evaluate(self, x, y, batch_size=32, verbose=1,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps, **kwargs)
   1655                               initial_epoch=initial_epoch,
   1656                               steps_per_epoch=steps_per_epoch,
-> 1657                               validation_steps=validation_steps)
   1658 
   1659     def evaluate(self, x=None, y=None,

/usr/local/lib/python3.5/dist-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, steps_per_epoch, validation_steps)
   1211                     batch_logs['size'] = len(batch_ids)
   1212                     callbacks.on_batch_begin(batch_index, batch_logs)
-> 1213                     outs = f(ins_batch)
   1214                     if not isinstance(outs, list):
   1215                         outs = [outs]

/usr/local/lib/python3.5/dist-packages/keras/backend/theano_backend.py in __call__(self, inputs)
   1222     def __call__(self, inputs):
   1223         assert isinstance(inputs, (list, tuple))
-> 1224         return self.function(*inputs)
   1225 
   1226 

/usr/local/lib/python3.5/dist-packages/theano/compile/function_module.py in __call__(self, *args, **kwargs)
    901         try:
    902             outputs =\
--> 903                 self.fn() if output_subset is None else\
    904                 self.fn(output_subset=output_subset)
    905         except Exception:

/usr/local/lib/python3.5/dist-packages/theano/gof/op.py in rval(p, i, o, n)
    889         if params is graph.NoParams:
    890             # default arguments are stored in the closure of `rval`
--> 891             def rval(p=p, i=node_input_storage, o=node_output_storage, n=node):
    892                 r = p(n, [x[0] for x in i], o)
    893                 for o in node.outputs:

KeyboardInterrupt: 

In [12]:


In [146]:
%%time

# simple 83%
epochs = 10
# define model
model = Sequential()
model.add(Embedding(len(word_index) + 1, 
                    EMBEDDING_DIM,
                    weights=[embedding_matrix],
                    input_length=MAX_SEQUENCE_LENGTH,
                    trainable=False))

# 128 = 83%, 64 = 827%,  256 = 83.1%
# model.add(Dense(256, activation='relu'))
# model.add(Dropout(0.25))
# 


model.add(Flatten())
model.add(Dense(num_classes, activation='sigmoid'))

adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

# compile the model
model.compile(optimizer=adam, 
              loss='categorical_crossentropy', metrics=['acc'])

print(model.summary())

print('Training...')
# Fit the model
network_hist = model.fit(x_train, y_train,
          batch_size=batch_size,
          shuffle=True,
          epochs=epochs,
          validation_data=(x_test, y_test))


score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


y_pred = model.predict(x_test)
# print(y_pred[:10])
# print(y_test[:10])
from sklearn.metrics import confusion_matrix

class_labels = np.argmax(y_test, axis=1) 
# print(class_labels[:10])
# print(y_pred.argmax(axis=1))
print(confusion_matrix(class_labels, 
                       y_pred.argmax(axis=1)))


_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_84 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
flatten_44 (Flatten)         (None, 50000)             0         
_________________________________________________________________
dense_125 (Dense)            (None, 3)                 150003    
=================================================================
Total params: 757,803
Trainable params: 150,003
Non-trainable params: 607,800
_________________________________________________________________
None
Training...
Train on 1159 samples, validate on 290 samples
Epoch 1/10
1159/1159 [==============================] - 0s 363us/step - loss: 1.0162 - acc: 0.4944 - val_loss: 0.9744 - val_acc: 0.5241
Epoch 2/10
1159/1159 [==============================] - 0s 395us/step - loss: 0.8829 - acc: 0.6376 - val_loss: 0.8568 - val_acc: 0.6931
Epoch 3/10
1159/1159 [==============================] - 0s 370us/step - loss: 0.7588 - acc: 0.7921 - val_loss: 0.7488 - val_acc: 0.7586
Epoch 4/10
1159/1159 [==============================] - 0s 355us/step - loss: 0.6533 - acc: 0.8076 - val_loss: 0.6729 - val_acc: 0.7517
Epoch 5/10
1159/1159 [==============================] - 0s 368us/step - loss: 0.5785 - acc: 0.8274 - val_loss: 0.6255 - val_acc: 0.7586
Epoch 6/10
1159/1159 [==============================] - 0s 360us/step - loss: 0.5264 - acc: 0.8387 - val_loss: 0.5942 - val_acc: 0.7724
Epoch 7/10
1159/1159 [==============================] - 0s 371us/step - loss: 0.4873 - acc: 0.8568 - val_loss: 0.5689 - val_acc: 0.7897
Epoch 8/10
1159/1159 [==============================] - 0s 366us/step - loss: 0.4534 - acc: 0.8766 - val_loss: 0.5542 - val_acc: 0.7862
Epoch 9/10
1159/1159 [==============================] - 0s 382us/step - loss: 0.4248 - acc: 0.8827 - val_loss: 0.5369 - val_acc: 0.8241
Epoch 10/10
1159/1159 [==============================] - 0s 394us/step - loss: 0.4015 - acc: 0.8904 - val_loss: 0.5261 - val_acc: 0.8172
290/290 [==============================] - 0s 139us/step
Test score: 0.5261147408649839
Test accuracy: 0.8172413793103448
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])
[[73  5 11]
 [ 0 79 16]
 [ 4 17 85]]
CPU times: user 5.82 s, sys: 564 ms, total: 6.38 s
Wall time: 5.65 s

In [120]:
# https://richliao.github.io/supervised/classification/2016/12/26/textclassifier-RNN/
# 83%
epochs = 20
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)

preds = Dense(num_classes, activation='softmax')(l_lstm)

model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])

print("model fitting - Bidirectional LSTM")
model.summary()

network_hist = model.fit(x_train, y_train,
          batch_size=batch_size,
          shuffle=True,
          epochs=epochs,
          validation_data=(x_test, y_test))

score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

plot_history(network_hist)


model fitting - Bidirectional LSTM
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_50 (InputLayer)        (None, 500)               0         
_________________________________________________________________
embedding_66 (Embedding)     (None, 500, 100)          607800    
_________________________________________________________________
bidirectional_28 (Bidirectio (None, 200)               160800    
_________________________________________________________________
dense_104 (Dense)            (None, 3)                 603       
=================================================================
Total params: 769,203
Trainable params: 769,203
Non-trainable params: 0
_________________________________________________________________
Train on 1159 samples, validate on 290 samples
Epoch 1/30
1159/1159 [==============================] - 105s 91ms/step - loss: 0.7601 - acc: 0.6497 - val_loss: 0.6852 - val_acc: 0.7414
Epoch 2/30
1159/1159 [==============================] - 107s 93ms/step - loss: 0.5180 - acc: 0.8093 - val_loss: 0.6861 - val_acc: 0.7724
Epoch 3/30
1159/1159 [==============================] - 104s 89ms/step - loss: 0.4541 - acc: 0.8248 - val_loss: 0.4748 - val_acc: 0.8345
Epoch 4/30
1159/1159 [==============================] - 101s 87ms/step - loss: 0.3971 - acc: 0.8602 - val_loss: 0.4616 - val_acc: 0.8414
Epoch 5/30
1159/1159 [==============================] - 128s 111ms/step - loss: 0.3702 - acc: 0.8619 - val_loss: 0.6967 - val_acc: 0.7552
Epoch 6/30
1159/1159 [==============================] - 120s 103ms/step - loss: 0.3356 - acc: 0.8740 - val_loss: 0.4998 - val_acc: 0.7966
Epoch 7/30
1159/1159 [==============================] - 104s 90ms/step - loss: 0.3007 - acc: 0.8852 - val_loss: 0.5377 - val_acc: 0.8138
Epoch 8/30
1159/1159 [==============================] - 105s 91ms/step - loss: 0.2691 - acc: 0.9042 - val_loss: 0.6045 - val_acc: 0.8034
Epoch 9/30
1159/1159 [==============================] - 106s 92ms/step - loss: 0.2248 - acc: 0.9284 - val_loss: 0.5015 - val_acc: 0.8379
Epoch 10/30
1159/1159 [==============================] - 107s 92ms/step - loss: 0.1895 - acc: 0.9318 - val_loss: 0.6315 - val_acc: 0.8000
Epoch 11/30
1159/1159 [==============================] - 107s 92ms/step - loss: 0.1541 - acc: 0.9474 - val_loss: 0.5746 - val_acc: 0.8345
Epoch 12/30
1159/1159 [==============================] - 110s 95ms/step - loss: 0.1431 - acc: 0.9508 - val_loss: 0.6771 - val_acc: 0.8172
Epoch 13/30
1159/1159 [==============================] - 110s 95ms/step - loss: 0.1094 - acc: 0.9646 - val_loss: 0.6163 - val_acc: 0.8310
Epoch 14/30
1159/1159 [==============================] - 108s 94ms/step - loss: 0.0797 - acc: 0.9741 - val_loss: 0.7219 - val_acc: 0.7966
Epoch 15/30
1159/1159 [==============================] - 116s 100ms/step - loss: 0.0575 - acc: 0.9836 - val_loss: 0.8555 - val_acc: 0.7897
Epoch 16/30
1159/1159 [==============================] - 136s 118ms/step - loss: 0.0449 - acc: 0.9871 - val_loss: 0.7120 - val_acc: 0.8379
Epoch 17/30
1159/1159 [==============================] - 141s 122ms/step - loss: 0.0455 - acc: 0.9862 - val_loss: 0.8490 - val_acc: 0.8310
Epoch 18/30
1159/1159 [==============================] - 121s 105ms/step - loss: 0.0341 - acc: 0.9888 - val_loss: 0.7290 - val_acc: 0.8483
Epoch 19/30
1159/1159 [==============================] - 145s 125ms/step - loss: 0.0222 - acc: 0.9922 - val_loss: 0.8030 - val_acc: 0.8414
Epoch 20/30
1159/1159 [==============================] - 154s 133ms/step - loss: 0.0136 - acc: 0.9974 - val_loss: 0.8802 - val_acc: 0.8241
Epoch 21/30
1159/1159 [==============================] - 126s 109ms/step - loss: 0.0138 - acc: 0.9974 - val_loss: 0.9108 - val_acc: 0.8379
Epoch 22/30
1159/1159 [==============================] - 107s 93ms/step - loss: 0.0043 - acc: 1.0000 - val_loss: 1.0122 - val_acc: 0.8310
Epoch 23/30
1159/1159 [==============================] - 108s 93ms/step - loss: 0.0178 - acc: 0.9948 - val_loss: 0.9250 - val_acc: 0.8345
Epoch 24/30
1159/1159 [==============================] - 110s 95ms/step - loss: 0.0037 - acc: 0.9991 - val_loss: 1.0217 - val_acc: 0.8310
Epoch 25/30
1159/1159 [==============================] - 129s 111ms/step - loss: 0.0100 - acc: 0.9983 - val_loss: 1.1403 - val_acc: 0.8207
Epoch 26/30
1159/1159 [==============================] - 109s 94ms/step - loss: 0.0094 - acc: 0.9957 - val_loss: 1.0355 - val_acc: 0.8172
Epoch 27/30
1159/1159 [==============================] - 131s 113ms/step - loss: 0.0034 - acc: 0.9991 - val_loss: 1.0819 - val_acc: 0.8345
Epoch 28/30
1159/1159 [==============================] - 162s 140ms/step - loss: 0.0119 - acc: 0.9974 - val_loss: 1.0574 - val_acc: 0.8276
Epoch 29/30
1159/1159 [==============================] - 166s 144ms/step - loss: 0.0020 - acc: 0.9991 - val_loss: 1.1140 - val_acc: 0.8414
Epoch 30/30
1159/1159 [==============================] - 157s 135ms/step - loss: 6.6628e-04 - acc: 1.0000 - val_loss: 1.3407 - val_acc: 0.8310
290/290 [==============================] - 7s 23ms/step
Test score: 1.3407317865383008
Test accuracy: 0.8310344827586207
dict_keys(['val_loss', 'loss', 'val_acc', 'acc'])

In [ ]: