Last active
January 15, 2018 18:56
-
-
Save hamelsmu/c20234c3f6e1ac44a870bedda97a1ea5 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
from keras.models import Model | |
from keras.layers import Input, LSTM, GRU, Dense, Embedding, Bidirectional, BatchNormalization | |
from keras import optimizers | |
#arbitrarly set latent dimension for embedding and hidden units | |
latent_dim = 300 | |
##### Define Model Architecture ###### | |
######################## | |
#### Encoder Model #### | |
encoder_inputs = Input(shape=(doc_length,), name='Encoder-Input') | |
# Word embeding for encoder (ex: Issue Body) | |
x = Embedding(num_encoder_tokens, | |
latent_dim, | |
name='Body-Word-Embedding', | |
mask_zero=False)(encoder_inputs) | |
x = BatchNormalization(name='Encoder-Batchnorm-1')(x) | |
# We do not need the `encoder_output` just the hidden state. | |
_, state_h = GRU(latent_dim, return_state=True, name='Encoder-Last-GRU')(x) | |
# Encapsulate the encoder as a separate entity so we can just | |
# encode without decoding if we want to. | |
encoder_model = Model(inputs=encoder_inputs, | |
outputs=state_h, | |
name='Encoder-Model') | |
seq2seq_encoder_out = encoder_model(encoder_inputs) | |
######################## | |
#### Decoder Model #### | |
decoder_inputs = Input(shape=(None,), name='Decoder-Input') # for teacher forcing | |
# Word Embedding For Decoder (ex: Issue Titles) | |
dec_emb = Embedding(num_decoder_tokens, | |
latent_dim, | |
name='Decoder-Word-Embedding', | |
mask_zero=False)(decoder_inputs) | |
dec_bn = BatchNormalization(name='Decoder-Batchnorm-1')(dec_emb) | |
# Set up the decoder, using `decoder_state_input` as initial state. | |
decoder_gru = GRU(latent_dim, | |
return_state=True, | |
return_sequences=True, | |
name='Decoder-GRU') | |
decoder_gru_output, _ = decoder_gru(dec_bn, initial_state=seq2seq_encoder_out) | |
x = BatchNormalization(name='Decoder-Batchnorm-2')(decoder_gru_output) | |
# Dense layer for prediction | |
decoder_dense = Dense(num_decoder_tokens, | |
activation='softmax', | |
name='Final-Output-Dense') | |
decoder_outputs = decoder_dense(x) | |
######################## | |
#### Seq2Seq Model #### | |
#seq2seq_decoder_out = decoder_model([decoder_inputs, seq2seq_encoder_out]) | |
seq2seq_Model = Model([encoder_inputs, decoder_inputs], decoder_outputs) | |
seq2seq_Model.compile(optimizer=optimizers.Nadam(lr=0.001), | |
loss='sparse_categorical_crossentropy') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment