如何在TensorFlow Keras中访问自定义层的递归层

时间:2019-08-13 14:15:55

标签: tensorflow keras keras-layer

来自tensorflow keras示例。我可以创建一个递归包含线性层的自定义层

class MLPBlock(layers.Layer):

  def __init__(self):
    super(MLPBlock, self).__init__()
    self.linear_1 = Linear(32)
    self.linear_2 = Linear(32)
    self.linear_3 = Linear(1)

  def call(self, inputs):
    x = self.linear_1(inputs)
    x = tf.nn.relu(x)
    x = self.linear_2(x)
    x = tf.nn.relu(x)
    return self.linear_3(x)

我如何访问自定义层的所有组成层,我想访问所有组成层的权重和偏差。

例如:

MLPBlock(Parent Layer):
    linear_1
    linear_2
    linear_3

我研究了Tensorflow keras api版本1.14 https://www.tensorflow.org/guide/keras 但找不到任何方法。

1 个答案:

答案 0 :(得分:0)

我假设您正在关注this tutorial。基于此,可以通过以下方式访问权重:

class MLPBlock(tf.keras.Model):

    def __init__(self):
        super(MLPBlock, self).__init__()
        self.linear_1 = tf.keras.layers.Dense(32)
        self.linear_2 = tf.keras.layers.Dense(32)
        self.linear_3 = tf.keras.layers.Dense(1)

    def call(self, inputs):
        x = self.linear_1(inputs)
        x = tf.nn.relu(x)
        x = self.linear_2(x)
        x = tf.nn.relu(x)
        return self.linear_3(x)

mlp_block = MLPBlock()
y = mlp_block(tf.ones(shape=(3, 64)))
for layer in mlp_block.layers:
    weights, biases = layer.get_weights()

请注意,我对示例进行了稍微修改,以便您可以访问图层的权重和偏差。即,我所做的不是用tf.keras.layers.Layer子类化,而是用tf.keras.Model子类化,以便可以将层的堆栈视为模型,然后可以访问该模型的层。然后,为了简单起见,我使用Linear而不是使用自定义tf.keras.layers.Dense层,但是,使用自定义层应该没有什么不同。