Keras Sequential model with multiple inputs
As in the answer you've linked, you cant be using the Sequential
API for the stated reason. You should use Model
API which is also called the functional API. Architecturally, you need to define to the model how you'll combine the inputs with the Dense layer ie how you want to create the intermediate layer viz. merge/add or subtract etc/construct a embedding layer etc), or maybe you want to have 2 neural networks, 1 for each input and only want to combine the output in the last layer. The code for each of the above will vary.
Here's a working solution assuming you want to merge the inputs into a vector of shape 672 and then construct a neural network on that input:
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam, RMSprop
import numpy as np
input1 = Input(shape=(336,))
input2 = Input(shape=(336,))
input = Concatenate()([input1, input2])
x = Dense(2)(input)
x = Dense(1)(x)
model = Model(inputs=[input1, input2], outputs=x)
model.summary()
You'll notice that this model merges or concatenates the two inputs and then constructs a neural network on top of that:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 336) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 336) 0
__________________________________________________________________________________________________
concatenate (Concatenate) (None, 672) 0 input_1[0][0]
input_2[0][0]
__________________________________________________________________________________________________
dense (Dense) (None, 2) 1346 concatenate[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 1) 3 dense[0][0]
==================================================================================================
Total params: 1,349
Trainable params: 1,349
Non-trainable params: 0
If you have some other preferred way to create the intermediate layer, you should replace the Concatenate
line with that in the code.
You can then compile and fit the model:
model.compile(
optimizer = RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
loss = 'mean_squared_error'
)
x1, x2 = np.random.randn(100, 336),np.random.randn(100, 336,)
y = np.random.randn(100, 1)
model.fit([x1, x2], y)
To solve this problem you have two options.
1. Using a sequential model
You can concatenate both arrays into one before feeding to the network. Let's assume the two arrays have a shape of (Number_data_points, ), now the arrays can be merged using numpy.stack
method.
merged_array = np.stack([array_1, array_2], axis=1)
model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])
model0.fit(merged_array,output, batch_size=16, epochs=100)
2. Using Functional API.
This is the most recommened way to use when there are multiple inputs to the model.
input1 = keras.layers.Input(shape=(1, ))
input2 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2])
dense1 = keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True)(merged)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense1)
model10 = keras.models.Model(inputs=[input1, input2], output=output)
Now you can use the second method you have trying to fit to the model
model0.fit([array_1, array_2],output, batch_size=16, epochs=100)