如何访问tensorflow keras中自定义层的递归层

如何访问tensorflow keras中自定义层的递归层,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,以tensorflow为例。我可以创建一个自定义层,其中包含递归的线性层 类MLPBlock(layers.Layer): 定义初始化(自): 超级(MLPBlock,self)。\uuuu init\uuuuu() self.linear_1=线性(32) self.linear_2=线性(32) self.linear_3=线性(1) def呼叫(自我,输入): x=自线性_1(输入) x=tf.nn.relu(x) x=自线性_2(x) x=tf.nn.relu(x) 返回自线性_3(x)

以tensorflow为例。我可以创建一个自定义层,其中包含递归的线性层

类MLPBlock(layers.Layer):
定义初始化(自):
超级(MLPBlock,self)。\uuuu init\uuuuu()
self.linear_1=线性(32)
self.linear_2=线性(32)
self.linear_3=线性(1)
def呼叫(自我,输入):
x=自线性_1(输入)
x=tf.nn.relu(x)
x=自线性_2(x)
x=tf.nn.relu(x)
返回自线性_3(x)
如何访问自定义层的所有组件层,我想访问所有组件层的权重和偏差

例:

MLPBlock(父层):
线性_1
线性_2
线性_3
我已经研究了tensorflow keras api版本R1.14
但是找不到任何方法来做这件事。

我想你在跟踪。基于此,以下是访问权重的方法:

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
对类进行子类化,这样可以将层堆栈视为一个模型,然后可以访问该模型的层。然后,为了简单起见,我使用了
tf.keras.layers.Dense
层,而不是使用自定义
Linear
层,但是,使用自定义层应该不会有什么不同。

感谢您的回复。我想再澄清一次。。本教程中提到了这一点。。层是递归可组合的,所以我可以制作复杂的层,这是层的组合。如何访问这些成员层。如果我有复杂的模型,我应该把我的模型作为子模型的组成部分吗?对于权重和偏差,只使用抽象层。你的直觉是正确的。如果您有一个复杂的模型,那么这是由
tf.keras.model
实例组成的。您可以轻松访问每个成员层,包括它们的权重和偏差。很高兴听到这个消息!那就毫不犹豫地把问题标记为已解决。