siva
siva

Reputation: 1513

Keras model with several inputs and several outputs

I want to build a Keras model with two inputs and two outputs which both use the same architecture/weights. Both outputs are then used to compute a​ single loss.

Here is a picture of my desired architecture.

enter image description here

This is my pseudo code:

model = LeNet(inputs=[input1, input2, input3],outputs=[output1, output2, output3])

model.compile(optimizer='adam',
          loss=my_custom_loss_function([output1,outpu2,output3],target)
          metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)

Can this approach work?
Do I need to use a different Keras API?

Upvotes: 0

Views: 238

Answers (1)

Primusa
Primusa

Reputation: 13498

The architecture is fine. Here is a toy example with training data of how it can be defined using keras' functional API:

from keras.models import Model
from keras.layers import Dense, Input

# two separate inputs
in_1 = Input((10,10))
in_2 = Input((10,10))


# both inputs share these layers
dense_1 = Dense(10)
dense_2 = Dense(10)

# both inputs are passed through the layers
out_1 = dense_1(dense_2(in_1))
out_2 = dense_1(dense_2(in_2))

# create and compile the model
model = Model(inputs=[in_1, in_2], outputs=[out_1, out_2])

model.compile(optimizer='adam', loss='mse')
model.summary()

# train the model on some dummy data
import numpy as np

i_1 = np.random.rand(10, 10, 10)
i_2 = np.random.rand(10, 10, 10)

model.fit(x=[i_1, i_2], y=[i_1, i_2])

Edit given that you want to compute the losses together you can use Concatenate()

output = Concatenate()([out_1, out_2])

Any loss function you pass into model.compile will be applied to output in it's combined state. After you get the output from a prediction you can just split it back up into it's original state:

f = model.predict(...)

out_1, out_2 = f[:n], f[n:]

Upvotes: 1

Related Questions