0

I am trying to concatenate two sequential models. I have a model which is a concatenation of two sub-models, each of which is a concatenation of two sequential models. I have the following code but it doesn't work with Keras 2.3.0

model = Sequential()

sub_model1 = Sequential()
sub_model_channel1 = Sequential()
sub_model_channel2 = Sequential()

sub_model_channel1.add(Dropout(dropout_prob[0], input_shape=(channels, sequence_length,sequence_length)))
sub_model_channel2.add(Dropout(dropout_prob[0], input_shape=(channels, sequence_length,sequence_length)))

in1 = Input(shape=(channels, sequence_length,sequence_length))
in2 = Input(shape=(channels, sequence_length,sequence_length))

convs1 = model_unichannel(in1)
convs2 = model_unichannel(in2)

out1 = Concatenate()(convs1)
out2 = Concatenate()(convs2)

m1 = Model(inputs=in1, outputs=out1)
m2 = Model(inputs=in2, outputs=out2)

sub_model_channel1.add(m1)
sub_model_channel2.add(m2)

m =  Concatenate()([sub_model_channel1, sub_model_channel2])
sub_model1.add(m)

model.add(sub_model1)

I am getting the following error ValueError: Layer concatenate_3 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.engine.sequential.Sequential'>. in the line m = Concatenate()([sub_model_channel1, sub_model_channel2]).

I have already looked at following solutions but nothing really solves my problem.

1) ValueError with Concatenate Layer (Keras functional API)

2) Merge 2 sequential models in Keras

I modified my code following the approach in the second link.

model = Sequential()

sub_model_channel1 = Sequential()
sub_model_channel2 = Sequential()

sub_model_channel1.add(Dropout(dropout_prob[0], input_shape=(channels, sequence_length,sequence_length)))
sub_model_channel2.add(Dropout(dropout_prob[0], input_shape=(channels, sequence_length,sequence_length)))

in1 = Input(shape=(channels, sequence_length,sequence_length))
in2 = Input(shape=(channels, sequence_length,sequence_length))

convs1 = model_unichannel(in1)    #adds Conv, MaxPooling and Flatten layer
convs2 = model_unichannel(in2)

out1 = Concatenate()(convs1)
out2 = Concatenate()(convs2)

m1 = Model(inputs=in1, outputs=out1)
m2 = Model(inputs=in2, outputs=out2)

sub_model_channel1.add(m1)
sub_model_channel2.add(m2)

m =  Concatenate()([sub_model_channel1.output, sub_model_channel2.output])
sub_model1 = Model([sub_model_channel1.input,sub_model_channel2.input], m)

model.add(sub_model1)

In this case I am getting an error ValueError: Layer model_3 expects 2 inputs, but it received 1 input tensors. Input received: [<tf.Tensor 'model_3_input:0' shape=(?, 7, 145, 145) dtype=float32>]. I understand this is because my model is also Sequential but how do I define the inputs? Also, is there any alternative way(apart from approach two) of doing this?

Nymeria
  • 3
  • 2
  • What exactly are you trying to do here ? `out1 = Concatenate()(convs1) out2 = Concatenate()(convs2)`. Concatenate takes a list of (at least 2) inputs. For example, `out1 = Concatenate()([convs1, convs2])` makes sense. The code you have doesn't – thushv89 May 10 '20 at 22:34
  • Thanks, but that's working fine! I want to know that if I follow the approach given in second link that I have shared, how do I add the sub-models to create a final model? `model = Model([sub_model1.input,sub_model2.input], merged_output_of_1and2)` results in `ValueError: Input tensors to a Model must come from `keras.layers.Input`. Received: [, ] (missing previous layer metadata).` – Nymeria May 12 '20 at 12:53

0 Answers0