<blockquote>
<p>the layers are instantiated early in the constructor function</p>
</blockquote>
<p>正确的</p>
<blockquote>
<p>the connection between the layers are established quite late</p>
</blockquote>
<p>同样正确的是,当您第一次调用<code>model.build()</code>或调用模型时,会初始化权重,正如您在<a href="https://keras.io/guides/making_new_layers_and_models_via_subclassing" rel="nofollow noreferrer">guide</a>子类Keras layers中看到的:</p>
<pre><code>class Linear(keras.layers.Layer):
def __init__(self, units=32):
super(Linear, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(
shape=(input_shape[-1], self.units),
initializer="random_normal",
trainable=True,
)
self.b = self.add_weight(
shape=(self.units,), initializer="random_normal", trainable=True
)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
</code></pre>
<blockquote>
<p>why the call function gets run three times at the early stage</p>
</blockquote>
<p>第一次可能是第一次调用模型,并实例化权重。然后另一次构建Tensorflow图,这是运行Tensorflow模型的非Python代码。该模型被调用一次以创建此图,并且进一步的调用在Python之外,因此打印函数不再是它的一部分。您可以使用<code>model.compile(..., run_eagerly=True)</code>更改此行为。最后,第三次将是第一次传递验证数据</p>