Search code examples
pythonmachine-learningkerasnlpword-embedding

Concatenate char embeddings and word embeddings


I want to use char sequences and word sequences as inputs. Each of them will be embedded its related vocabulary and then resulted embeddings will be concatenated. I write following code to concatenate two embeddings:

char_model = Sequential()
char_model.add(Embedding(vocab_size, char_emnedding_dim,input_length=char_size,embeddings_initializer='random_uniform',trainable=False, input_shape=(char_size, )))

word_model = Sequential()
word_model.add(Embedding(word_vocab_size,word_embedding_dim, weights=[embedding_matrix], input_length=max_length, trainable=False,input_shape=(max_length, )))

model = Sequential()
model.add(Concatenate([char_model, word_model]))
model.add(Dropout(drop_prob))
model.add(Conv1D(filters=250, kernel_size=3, padding='valid', activation='relu', strides = 1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims)) # fully connected layer
model.add(Dropout(drop_prob)) 
model.add(Activation('relu'))
model.add(Dense(num_classes)) 
model.add(Activation('softmax'))
print(model.summary())

When I execute the code, I have the following error:

ValueError: This model has not yet been built. Build the model first by calling build() or calling fit() with some data. Or specify input_shape or batch_input_shape in the first layer for automatic build. 

I defined input_shape for each embedding, but I still have same error. How can I concatenate two sequential model?


Solution

  • The problem is in this line:

    model.add(Concatenate([char_model, word_model]))
    

    Let alone you are calling Concatenate layer wrongly, you can't have a concatenation layer in a Sequential model since it would no longer be a Sequential model by definition. Instead, use Keras Functional API to define such a model.