Created
April 24, 2016 16:26
-
-
Save ameasure/16fd35b0e409aa7567855e5b04d40788 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'''Train a Bidirectional LSTM on the IMDB sentiment classification task. | |
Output after 4 epochs on CPU: ~0.8146 | |
Time per epoch on CPU (Core i7): ~150s. | |
''' | |
from __future__ import print_function | |
import numpy as np | |
np.random.seed(1337) # for reproducibility | |
from keras.preprocessing import sequence | |
from keras.models import Model | |
from keras.layers import Dense, Dropout, Embedding, LSTM, Input, merge | |
from keras.datasets import imdb | |
max_features = 20000 | |
maxlen = 100 # cut texts after this number of words (among top max_features most common words) | |
batch_size = 32 | |
print('Loading data...') | |
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features, | |
test_split=0.2) | |
print(len(X_train), 'train sequences') | |
print(len(X_test), 'test sequences') | |
print("Pad sequences (samples x time)") | |
X_train = sequence.pad_sequences(X_train, maxlen=maxlen) | |
X_test = sequence.pad_sequences(X_test, maxlen=maxlen) | |
print('X_train shape:', X_train.shape) | |
print('X_test shape:', X_test.shape) | |
y_train = np.array(y_train) | |
y_test = np.array(y_test) | |
# this is the placeholder tensor for the input sequences | |
sequence = Input(shape=(maxlen,), dtype='int32') | |
# this embedding layer will transform the sequences of integers | |
# into vectors of size 128 | |
embedded = Embedding(max_features, 1000, input_length=maxlen)(sequence) | |
# apply forwards LSTM | |
forwards = LSTM(64, dropout_W=0.5)(embedded) | |
# apply backwards LSTM | |
backwards = LSTM(64, go_backwards=True)(embedded) | |
# concatenate the outputs of the 2 LSTMs | |
merged = merge([forwards, backwards], mode='concat', concat_axis=-1) | |
after_dp = Dropout(0.5)(merged) | |
output = Dense(1, activation='sigmoid')(after_dp) | |
model = Model(input=sequence, output=output) | |
# try using different optimizers and different optimizer configs | |
model.compile('adam', 'binary_crossentropy', metrics=['accuracy']) | |
print('Train...') | |
model.fit(X_train, y_train, | |
batch_size=batch_size, | |
nb_epoch=4, | |
validation_data=[X_test, y_test]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment