Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement a custom layer wit multiple outputs in Keras?

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?

like image 933
Tassou Avatar asked Jan 10 '18 19:01

Tassou


1 Answers

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__)
like image 110
Daniel Möller Avatar answered Nov 15 '22 00:11

Daniel Möller