【问题标题】:How does Tensorflow build() work from tf.keras.layers.LayerTensorflow build() 如何从 tf.keras.layers.Layer 工作
【发布时间】:2020-12-02 14:52:17
【问题描述】:

我想知道是否有人知道 build() 函数是如何从 tf.keras.layers.Layer 类的底层工作的。根据documentation

当您知道输入张量的形状并且可以 做剩下的初始化工作

所以对我来说,班级的行为似乎与此类似:

class MyDenseLayer:
  def __init__(self, num_outputs):
    self.num_outputs = num_outputs

  def build(self, input_shape):
    self.kernel = self.add_weight("kernel",
                                  shape=[int(input_shape[-1]), self.num_outputs])

  def __call__(self, input):
    self.build(input.shape) ## build is called here when input shape is known
    return tf.matmul(input, self.kernel)

我无法想象 build() 会永远被调用 __call__,但它是唯一传入输入的地方。有谁知道这到底是如何工作的?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    Layer.build() 方法通常用于实例化层的权重。有关示例,请参见 source code for tf.keras.layers.Dense,并注意权重和偏差张量是在该函数中创建的。 Layer.build() 方法采用 input_shape 参数,权重和偏差的形状通常取决于输入的形状。

    另一方面,Layer.call() 方法实现了层的前向传递。您不想覆盖__call__,因为这是在基类tf.keras.layers.Layer 中实现的。在自定义层中,您应该实现call()

    Layer.call() 不调用Layer.build()。然而,Layer().__call__()确实调用它如果层还没有被构建(source),这将设置一个属性self.built = True来防止Layer.build()被再次调用。换句话说,Layer.__call__() 只在第一次调用时调用Layer.build()

    【讨论】:

    • 我明白了。因此,正如我想象的那样,它在第一次向前传球时被调用。感谢提供资源。非常感谢。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2014-08-05
    • 2020-05-04
    • 2021-05-16
    • 1970-01-01
    • 2021-10-02
    • 2019-07-23
    • 2021-04-11
    相关资源
    最近更新 更多