Based on the following link I was able to build a simple GloVe model with pretrained word embeddings: https://keras.rstudio.com/articles/examples/pretrained_word_embeddings.html.
Using the functional API of Keras, I used the following code to define and train the model.
# Use Keras Functional API
main_input <- layer_input(shape = list(maxlen), name = "input")
lstm_out <- main_input %>%
layer_embedding(input_dim = max_words,
output_dim = dim_size,
input_length = maxlen,
weights = list(word_embeds), trainable = FALSE) %>%
layer_spatial_dropout_1d(rate = 0.2 ) %>%
bidirectional(layer_gru(units = 80, return_sequences = TRUE))
max_pool <- lstm_out %>% layer_global_max_pooling_1d()
ave_pool <- lstm_out %>% layer_global_average_pooling_1d()
output <- layer_concatenate(list(ave_pool, max_pool)) %>%
layer_dense(units = 1,
activation = "sigmoid")
model <- keras_model(input, output)
model %>% compile(
optimizer = "adam",
loss = "binary_crossentropy",
metrics = tensorflow::tf$keras$metrics$AUC()
)
history = model %>% keras::fit(
x_train, y_train,
epochs = 8,
batch_size = 32,
validation_split = 0.2
)
Now I would like to add a second layer to the model which has three numerical variables. According to the keras documentation, one has to build a multi input model for this: https://keras.rstudio.com/articles/functional_api.html.
I have tried to somehow integrate and define this new layer but I can't get it to work.
# Define auxiliary_output
auxiliary_output <- lstm_out %>%
layer_dense(units = 3,
activation = 'sigmoid',
name = 'aux_output')
# Create auxiliary_input
auxiliary_input <- layer_input(shape = list(maxlen),
name = "aux_input")
# "Stack" both layers on top of each other
main_output <- layer_concatenate(c(lstm_out, auxiliary_input)) %>%
layer_dense(units = 64, activation = 'relu') %>%
layer_dense(units = 64, activation = 'relu') %>%
layer_dense(units = 64, activation = 'relu') %>%
layer_dense(units = 5, activation = 'sigmoid', name = 'main_output')
# Define model with two in- and outputs
model <- keras_model(inputs = c(data_glove, data_numerical),
outputs = c(output, auxiliary_output ))
Doing it this way yields the following error message:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 60, 160), (None, 60)]
I'm pretty lost with this and since I am just beginning to dive into the world of deep learning I would appreciate any input on this. Thank you very much.