title: Using a Custom Dual Input Keras Layer
body: <p>I am attempting to create a simple multi-layer perceptron in Keras. The general structure I would like to create is one where a matrix A of dimension [n_a1, n_a2] is sent through a number of layers of a multilayer perceptron, and at a certain point, the dot product of the morphed A matrix is taken with a randomly selected y vector [n_y, 1] from a set of y vectors, and the result then continues through a number more layers before reaching the end where it is compared with the input labels as normal.</p>
  
  <p>Unfortunately, I am having issues with figuring how to implement this properly. I created a custom multi-input layer per the simple example offered at <a href="https://keras.io/layers/writing-your-own-keras-layers/" rel="nofollow noreferrer">https://keras.io/layers/writing-your-own-keras-layers/</a>, but it seems that I still can't have multiple inputs in the network. I am getting an error for setting an array element as a sequence: <code>ValueError: setting an array element with a sequence.</code></p>
  
  <p>Also, its unclear to me how the network would know what to do with the list formatted inputs for the other layers. Do I need to specify the list shape for each layer, and to somehow only use the A in the [A, y] list?</p>
  
  <p><strong>Custom Layer</strong></p>
  
  <pre><code>class DualLayer(Layer):
  
      def __init__(self, output_dim, **kwargs):
          self.output_dim = output_dim
          super(DualLayer, self).__init__(**kwargs)
  
      def build(self, input_shape):
          #Trainable weight variable for layer
          self.kernel = self.add_weight(name='kernel',
                                       shape=(input_shape[1], self.output_dim),
                                       initializer='uniform',
                                       trainable=True)
          super(DualLayer, self).build(input_shape)
  
      def call(self, x):
          aOpt, y = x
          return [K.dot(aOpt, y)]
  
      def compute_outpute_shape(self, input_shape):
          assert isinstance(input_shape, list)
          shape_y, shape_aOpt = input_shape
          return [shape_y[0]]
  </code></pre>
  
  <p><strong>Model</strong></p>
  
  <pre><code>def modFunc(y1, A1, y2, A2, xSim):
      model = Sequential()
      model.add(Flatten(input_shape = np.shape(A1)))
      model.add(Dense(np.shape(A1)[0]*np.shape(A1)[1], activation = 'relu',
                      kernel_regularizer = 'l1', activity_regularizer = 'l1'))
      model.add(DualLayer([y1, A1]))
      model.add(Dense(5, activation = 'relu'))
  
      clf = model.fit([y1, A1], xSim, epochs=5, batch_size=1, verbose=2)
      return clf.coef_
  </code></pre>