title: How can I call a custom layer in Keras with the functional API
body: <p>I have written a tiny implementation of a Keras custom layer where I have literally copied the class definition from <a href="https://keras.io/layers/writing-your-own-keras-layers/" rel="nofollow noreferrer">https://keras.io/layers/writing-your-own-keras-layers/</a></p>
  
  <p>Yet when I try to call this custom layer as I would a standard Dense layer, I get the error "AssertionError" and my pycharm throws the warning that the object is not callable</p>
  
  <p>I am missing something basic here but I cannot figure it out</p>
  
  <p>If I switch the line</p>
  
  <pre><code>model_out = MyLayer(2)(model_in)
  </code></pre>
  
  <p>to</p>
  
  <pre><code>model_out = Dense(2)(model_in)
  </code></pre>
  
  <p>it works</p>
  
  <p>Here's the code that doesn't run:</p>
  
  <pre><code>from tensorflow.keras.layers import Dense, Input
  from tensorflow.keras.models import Model
  import numpy as np
  from tensorflow.keras.layers import Layer
  from tensorflow.keras import backend as K
  from tensorflow.keras import optimizers
  
  
  class MyLayer(Layer):
  
      def __init__(self, output_dim, **kwargs):
          self.output_dim = output_dim
          super(MyLayer, self).__init__(**kwargs)
  
      def build(self, input_shape):
          # Create a trainable weight variable for this layer.
          self.kernel = self.add_weight(name='kernel',
                                        shape=(input_shape[1], self.output_dim),
                                        initializer='uniform',
                                        trainable=True)
          super(MyLayer, self).build(input_shape)  # Be sure to call this at the end
  
      def call(self, x):
          return K.dot(x, self.kernel)
  
      def compute_output_shape(self, input_shape):
          return (input_shape[0], self.output_dim)
  
  
  model_in = Input([4])
  model_out = MyLayer(2)(model_in)
  model = Model(inputs=model_in, outputs=model_out, name='my_model')
  
  adamOpt = optimizers.Adam(lr=1e-4)
  model.compile(optimizer=adamOpt, loss='mean_squared_error')
  
  hist = model.fit(np.ones((10, 4)), np.ones((10, 2))+1, verbose=2, epochs=100, batch_size=np.power(2,2))
  </code></pre>
  
  <p>I expect that this should compile and run, as it does if I call Dense instead of MyLayer</p>
  
  <p>Full error</p>
  
  <pre><code>Traceback (most recent call last):
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 527, in make_tensor_proto
      str_values = [compat.as_bytes(x) for x in proto_values]
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 527, in &lt;listcomp&gt;
      str_values = [compat.as_bytes(x) for x in proto_values]
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\util\compat.py", line 61, in as_bytes
      (bytes_or_text,))
  TypeError: Expected binary or unicode string, got Dimension(4)
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "G:/My Drive/python/wholebrain_worm/extra_classes.py", line 31, in &lt;module&gt;
      model_out = MyLayer(2)(model_in)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 746, in __call__
      self.build(input_shapes)
    File "G:/My Drive/python/wholebrain_worm/extra_classes.py", line 20, in build
      trainable=True)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 609, in add_weight
      aggregation=aggregation)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\training\checkpointable\base.py", line 639, in _add_variable_with_custom_getter
      **kwargs_for_getter)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1977, in make_variable
      aggregation=aggregation)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 183, in __call__
      return cls._variable_v1_call(*args, **kwargs)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 146, in _variable_v1_call
      aggregation=aggregation)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 125, in &lt;lambda&gt;
      previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 2437, in default_variable_creator
      import_scope=import_scope)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 187, in __call__
      return super(VariableMetaclass, cls).__call__(*args, **kwargs)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py", line 297, in __init__
      constraint=constraint)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py", line 409, in _init_from_args
      initial_value() if init_from_fn else initial_value,
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1959, in &lt;lambda&gt;
      shape, dtype=dtype, partition_info=partition_info)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\init_ops.py", line 255, in __call__
      shape, self.minval, self.maxval, dtype, seed=self.seed)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\random_ops.py", line 235, in random_uniform
      shape = _ShapeTensor(shape)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\random_ops.py", line 44, in _ShapeTensor
      return ops.convert_to_tensor(shape, dtype=dtype, name="shape")
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\ops.py", line 1050, in convert_to_tensor
      as_ref=False)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\ops.py", line 1146, in internal_convert_to_tensor
      ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\constant_op.py", line 229, in _constant_tensor_conversion_function
      return constant(v, dtype=dtype, name=name)
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\constant_op.py", line 208, in constant
      value, dtype=dtype, shape=shape, verify_shape=verify_shape))
    File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 531, in make_tensor_proto
      "supported type." % (type(values), values))
  TypeError: Failed to convert object of type &lt;class 'tuple'&gt; to Tensor. Contents: (Dimension(4), 2). Consider casting elements to a supported type.
  </code></pre>