Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use keras layers in custom keras layer

I am trying to write my own keras layer. In this layer, I want to use some other keras layers. Is there any way to do something like this:

class MyDenseLayer(tf.keras.layers.Layer):
  def __init__(self, num_outputs):
    super(MyDenseLayer, self).__init__()
    self.num_outputs = num_outputs

  def build(self, input_shape):
    self.fc = tf.keras.layers.Dense(self.num_outputs)

  def call(self, input):
    return self.fc(input)

layer = MyDenseLayer(10)

When I do something like

input = tf.keras.layers.Input(shape = (16,))
output = MyDenseLayer(10)(input)
model = tf.keras.Model(inputs = [input], outputs = [output])
model.summary()

it outputs enter image description here

How do I make weiths in the dense there trainable?

like image 789
I-PING Ou Avatar asked Jan 15 '19 07:01

I-PING Ou


People also ask

How do Keras layers work?

Keras Layers are the functional building blocks of Keras Models. Each layer is created using numerous layer_() functions. These layers are fed with input information, they process this information, do some computation and hence produce the output. Further, this output of one layer is fed to another layer as its input.

How do you use lambda layer in Keras?

Lambda is used to transform the input data using an expression or function. For example, if Lambda with expression lambda x: x ** 2 is applied to a layer, then its input data will be squared before processing. function represent the lambda function.

How do I print a layer in Keras?

Just do a model. summary() . It will print all layers and their output shapes.


2 Answers

If you look at the documentation for how to add custom layers, they recommend that you use the .add_weight(...) method. This method internally places all weights in self._trainable_weights. So to do what you want, you mush first define the keras layers you want to use, build them, copy the weights and then build your own layer. If I update your code it should be something like

class mylayer(tf.keras.layers.Layer):
    def __init__(self, num_outputs, num_outputs2):
        self.num_outputs = num_outputs
        super(mylayer, self).__init__()

    def build(self, input_shape):
        self.fc = tf.keras.layers.Dense(self.num_outputs)
        self.fc.build(input_shape)
        self._trainable_weights = self.fc.trainable_weights
        super(mylayer, self).build(input_shape)

    def call(self, input):
        return self.fc(input)

layer = mylayer(10)
input = tf.keras.layers.Input(shape=(16, ))
output = layer(input)
model = tf.keras.Model(inputs=[input], outputs=[output])
model.summary()

You should then get what you want enter image description here

like image 58
Nicki Skafte Avatar answered Oct 09 '22 09:10

Nicki Skafte


It's much more comfortable and concise to put existing layers in the tf.keras.models.Model class. If you define non-custom layers such as layers, conv2d, the parameters of those layers are not trainable by default.

class MyDenseLayer(tf.keras.Model):
  def __init__(self, num_outputs):
    super(MyDenseLayer, self).__init__()
    self.num_outputs = num_outputs
    self.fc = tf.keras.layers.Dense(num_outputs)

  def call(self, input):
    return self.fc(input)

  def compute_output_shape(self, input_shape):
    shape = tf.TensorShape(input_shape).as_list()
    shape[-1] = self.num_outputs
    return tf.TensorShape(shape)

layer = MyDenseLayer(10)

Check this tutorial: https://www.tensorflow.org/guide/keras#model_subclassing

like image 33
Alexander Avatar answered Oct 09 '22 11:10

Alexander