我已经创建了一个自定义层使用层子类化。这层是由一系列特定的密集层组成,并有相同大小的输入和输出。我希望堆叠这些一个接一个,使他们都有独立的,可训练的,权重和偏见。
这个自定义层用于通过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,即两次调用具有相同名称的内容,而我正在独立地训练该层的两个完全独立的示例,正如我所希望的那样?
1条答案
按热度按时间wnvonmuf1#
因为
weights
在层被重用时保持不变,所以可训练的参数没有被添加到model.summary()
。我很惊讶地看到,你没有得到一个自定义层的输入和输出形状的错误,而且前一个和下一个不兼容。但这可能是由于层是Dense
。如果你一直使用Conv2D
或任何其他这样的层,您将得到一个错误。尝试为每一层赋予唯一的名称,即使你重复使用代码。这将初始化新的权重到层,并将参数添加到
model.summary()