Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom connections between layers Keras

I would like to manually define connections in neural network between layers using keras with Python. By default connections are beween all pairs of neurons. I need to make connections as in picture below.

required architecture

How can I be done in Keras?

like image 506
holocen Avatar asked Nov 13 '17 13:11

holocen


People also ask

What is model subclassing?

In Model Sub-Classing there are two most important functions __init__ and call. Basically, we will define all the trainable tf. keras layers or custom implemented layers inside the __init__ method and call those layers based on our network design inside the call method which is used to perform a forward propagation.

How do I create a custom layer in TensorFlow?

Implementing custom layers Layer class and implementing: __init__ , where you can do all input-independent initialization. build , where you know the shapes of the input tensors and can do the rest of the initialization. call , where you do the forward computation.

What is a fully connected layer in Keras?

Fully connected layers are defined using the Dense class. You can specify the number of neurons or nodes in the layer as the first argument and the activation function using the activation argument.


1 Answers

You can use the functional API model and separate four distinct groups:

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

inputTensor = Input((8,))

First, we can use lambda layers to split this input in four:

group1 = Lambda(lambda x: x[:,:2], output_shape=((2,)))(inputTensor)
group2 = Lambda(lambda x: x[:,2:4], output_shape=((2,)))(inputTensor)
group3 = Lambda(lambda x: x[:,4:6], output_shape=((2,)))(inputTensor)
group4 = Lambda(lambda x: x[:,6:], output_shape=((2,)))(inputTensor)

Now we follow the network:

#second layer in your image
group1 = Dense(1)(group1)
group2 = Dense(1)(group2)
group3 = Dense(1)(group3)   
group4 = Dense(1)(group4)

Before we connect the last layer, we concatenate the four tensors above:

outputTensor = Concatenate()([group1,group2,group3,group4])

Finally the last layer:

outputTensor = Dense(2)(outputTensor)

#create the model:
model = Model(inputTensor,outputTensor)

Beware of the biases. If you want any of those layers to have no bias, use use_bias=False.


Old answer: backwards

Sorry, I saw your image backwards the first time I answered. I'm keeping this here just because it's done...

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

inputTensor = Input((2,))

#four groups of layers, all of them taking the same input tensor
group1 = Dense(1)(inputTensor)
group2 = Dense(1)(inputTensor)
group3 = Dense(1)(inputTensor)   
group4 = Dense(1)(inputTensor)

#the next layer in each group takes the output of the previous layers
group1 = Dense(2)(group1)
group2 = Dense(2)(group2)
group3 = Dense(2)(group3)
group4 = Dense(2)(group4)

#now we join the results in a single tensor again:
outputTensor = Concatenate()([group1,group2,group3,group4])

#create the model:
model = Model(inputTensor,outputTensor)
like image 95
Daniel Möller Avatar answered Oct 10 '22 16:10

Daniel Möller