def __init__(self, config, ntags=None): # build input, directly feed with word embedding by the data generator word_input = Input(shape=(None, config.word_embedding_size), name='word_input') # build character based embedding char_input = Input(shape=(None, config.max_char_length), dtype='int32', name='char_input') char_embeddings = TimeDistributed(Embedding(input_dim=config.char_vocab_size, output_dim=config.char_embedding_size, mask_zero=True, #embeddings_initializer=RandomUniform(minval=-0.5, maxval=0.5), name='char_embeddings' ))(char_input) chars = TimeDistributed(Bidirectional(LSTM(config.num_char_lstm_units, return_sequences=False)))(char_embeddings) # length of sequence not used for the moment (but used for f1 communication) length_input = Input(batch_shape=(None, 1), dtype='int32', name='length_input') # combine characters and word embeddings x = Concatenate()([word_input, chars]) x = Dropout(config.dropout)(x) x = Bidirectional(LSTM(units=config.num_word_lstm_units, return_sequences=True, recurrent_dropout=config.recurrent_dropout))(x) x = Dropout(config.dropout)(x) x = Dense(config.num_word_lstm_units, activation='tanh')(x) x = Dense(ntags)(x) self.crf = ChainCRF() pred = self.crf(x) self.model = Model(inputs=[word_input, char_input, length_input], outputs=[pred]) self.config = config
def __init__(self, config, ntags=None): # build input, directly feed with word embedding by the data generator word_input = Input(shape=(None, config.word_embedding_size), name='word_input') # build character based embedding char_input = Input(shape=(None, config.max_char_length), dtype='int32', name='char_input') char_embeddings = TimeDistributed( Embedding(input_dim=config.char_vocab_size, output_dim=config.char_embedding_size, mask_zero=True, name='char_embeddings' ))(char_input) dropout = Dropout(config.dropout)(char_embeddings) conv1d_out = TimeDistributed(Conv1D(kernel_size=3, filters=30, padding='same',activation='tanh', strides=1))(dropout) maxpool_out = TimeDistributed(GlobalMaxPooling1D())(conv1d_out) chars = Dropout(config.dropout)(maxpool_out) # custom features input and embeddings casing_input = Input(batch_shape=(None, None,), dtype='int32', name='casing_input') """ casing_embedding = Embedding(input_dim=config.case_vocab_size, output_dim=config.case_embedding_size, mask_zero=True, trainable=False, name='casing_embedding')(casing_input) casing_embedding = Dropout(config.dropout)(casing_embedding) """ # length of sequence not used for the moment (but used for f1 communication) length_input = Input(batch_shape=(None, 1), dtype='int32') # combine words, custom features and characters x = Concatenate(axis=-1)([word_input, chars]) x = Dropout(config.dropout)(x) x = Bidirectional(LSTM(units=config.num_word_lstm_units, return_sequences=True, recurrent_dropout=config.recurrent_dropout))(x) x = Dropout(config.dropout)(x) x = Dense(config.num_word_lstm_units, activation='tanh')(x) x = Dense(ntags)(x) self.crf = ChainCRF() pred = self.crf(x) self.model = Model(inputs=[word_input, char_input, casing_input, length_input], outputs=[pred]) self.config = config