6

Like stated in the title, I was wondering as to how to have the custom layer returning multiple tensors: out1, out2,...outn?
I tried

keras.backend.concatenate([out1, out2], axis = 1)

But this does only work for tensors having the same length, and it has to be another solution rather than concatenating two by two tensors every time, is it?

1
  • Have you looked at keras.io/models/model. Using the keras Model API rather than Sequential, will allow you to define multiple outputs. If this isn't what you're looking for you probably need to provide more description. Commented Jan 10, 2018 at 19:42

1 Answer 1

4

In the call method of your layer, where you perform the layer calculations, you can return a list of tensors:

def call(self, inputTensor):

    #calculations with inputTensor and the weights you defined in "build"
    #inputTensor may be a single tensor or a list of tensors

    #output can also be a single tensor or a list of tensors
    return [output1,output2,output3]

Take care of the output shapes:

def compute_output_shape(self,inputShape):

    #calculate shapes from input shape    
    return [shape1,shape2,shape3]

The result of using the layer is a list of tensors. Naturally, some kinds of keras layers accept lists as inputs, others don't.
You have to manage the outputs properly using a functional API Model. You're probably going to have problems using a Sequential model while having multiple outputs.

I tested this code on my machine (Keras 2.0.8) and it works perfectly:

from keras.layers import *
from keras.models import *
import numpy as np

class Lay(Layer):
    def init(self):
        super(Lay,self).__init__()

    def build(self,inputShape):
        super(Lay,self).build(inputShape)

    def call(self,x):
        return [x[:,:1],x[:,-1:]]

    def compute_output_shape(self,inputShape):
        return [(None,1),(None,1)]


inp = Input((2,))
out = Lay()(inp)
print(type(out))

out = Concatenate()(out)
model = Model(inp,out)
model.summary()

data = np.array([[1,2],[3,4],[5,6]])
print(model.predict(data))

import keras
print(keras.__version__)
Sign up to request clarification or add additional context in comments.

4 Comments

when I try this, I get : ValueError: Unexpectedly found an instance of type <type 'list'>. Expected a symbolic tensor instance.
Are you using a Sequential model? What is your keras version? What layer you put after this one?
If you'd share more of the stack trace (not only the message, but the function where this message appears and the file), it might be easier to find the issue.
I am using keras version 2.1.2. I just worked around it with some Keras.backend.stack() lines

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.