keras 重复使用自定义层不会向模型添加参数,摘要?

t9eec4r0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(146)

我已经创建了一个自定义层使用层子类化。这层是由一系列特定的密集层组成,并有相同大小的输入和输出。我希望堆叠这些一个接一个,使他们都有独立的,可训练的,权重和偏见。
这个自定义层用于通过model子类化API构建的模型中。当我在model子类的call方法中两次使用这个层时(即,当我在下面两次使用self.custom_layer时,一个接一个),在训练结束时打印的model.summary()只显示其中一个层,并且只列出其中一个层的参数数量。
然而,当我为自定义层的示例使用单独的名称时(如下所示),model.summary()将两个层显示为单独的,并显示参数数量的增加。

class custom_model(Model):
    def __init__(self):
        super().__init__()
        self.custom_layer = custom_layer()
        self.custom_layer_2 = custom_layer()
        self.dense64 = tf.keras.layers.Dense(64)
        self.dense60 = tf.keras.layers.Dense(60)

    def call(self, inputs):
        out = self.custom_layer(inputs)
        out = self.custom_layer_2(out)
        out = self.dense64(out)
        out = self.dense60(out)

        return out

那么,两次使用相同的名称是怎么回事呢?通过两次使用self.custom_layer,我是否实际上只训练了这些层中的第一层,并在我的模型中创建了一个单独的循环?或者,model.summary()中是否存在一个bug,即两次调用具有相同名称的内容,而我正在独立地训练该层的两个完全独立的示例,正如我所希望的那样?

wnvonmuf

wnvonmuf1#

因为weights在层被重用时保持不变,所以可训练的参数没有被添加到model.summary()。我很惊讶地看到,你没有得到一个自定义层的输入和输出形状的错误,而且前一个和下一个不兼容。但这可能是由于层是Dense。如果你一直使用Conv2D或任何其他这样的层,您将得到一个错误。
尝试为每一层赋予唯一的名称,即使你重复使用代码。这将初始化新的权重到层,并将参数添加到model.summary()

相关问题