如何在自定义keras图层中使用keras图层

I-P*_* Ou 10 keras tensorflow

我正在尝试编写自己的keras图层。在这一层中,我想使用其他一些keras层。有什么办法可以做这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

当我做类似的事情

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

它输出 在此处输入图片说明

我如何使weith在密集的地方训练?

小智 11

如果您查看有关如何添加自定义图层的文档,则他们建议您使用该.add_weight(...)方法。此方法在内部将所有权重放置在中self._trainable_weights。因此,要做您想做的事情,您首先必须定义要使用的keras图层,构建它们,复制权重,然后构建您自己的图层。如果我更新您的代码,它应该类似于

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()
Run Code Online (Sandbox Code Playgroud)

然后你应该得到你想要的 在此处输入图片说明


Ale*_*der 5

将现有层放入 tf.keras.models.Model 类中更加舒适和简洁。如果您定义非自定义层(例如层、conv2d),则默认情况下这些层的参数不可训练。

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)
Run Code Online (Sandbox Code Playgroud)

检查本教程:https://www.tensorflow.org/guide/keras#model_subclassing